• 13
  • 13
分享

一、Selenium简介

Selenium是一个用于Web应用程序自动化测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7、8、9、10、11),Mozilla Firefox,Safari,Google Chrome,Opera等。

这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序是否能够很好的工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.Net、Java、Perl等不同语言的测试脚本。

二、使用Selenium的准备工作

因为Selenium是直接运行在浏览器里的,所以使用时需要对应的Selenium驱动(本文使用的是谷歌浏览器),注意浏览器与Selenium驱动的版本一定要保持一致,查看谷歌浏览器版本可点击右上角-》帮助-》关于Google:

1.png

谷歌浏览器selenium驱动下载

2.png

如果浏览器与驱动版本不对应则会出现如下异常:

3.png

使用java代码来控制Selenium还需要用到以下jar包:

4.png

如果是maven项目的话,可用以下代码引入Selenium的依赖:

<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.0</version>
</dependency>

三、Selenium使用案例

案例1、打开百度首页并模拟搜索

代码如下:

package com.ue.demo;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
/**
 * 打开百度首页并模拟搜索
 * @author LiJun
 * @Date 2020年09月03日
 * @Time 16:30
 */
public class Demo1 {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+"/driver/chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        String url = "http://www.baidu.com";
        driver.get(url);//打开指定的网站
//        driver.navigate().to(url);//打开指定的网站
        //找到搜索框
        WebElement input = driver.findElement(By.xpath("//*[@id=\"kw\"]"));
        //往搜索框填入“selenium”
        input.sendKeys("selenium");
        //找到“百度一下”按钮
        WebElement button = driver.findElement(By.xpath("//*[@id=\"su\"]"));
        //点击按钮
        button.click();
//        driver.close();//浏览器关闭
//        driver.quit();//释放资源
    }
}

运行结果:

5.png

案例2、使用QQ登录百度网盘,新建一个文件夹,随后再将其删除

代码如下:

package com.ue.demo;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
 * 使用QQ登录百度云,新建一个文件夹,随后再将其删除
 * @author LiJun
 * @Date 2020年09月03日
 * @Time 18:52
 */
public class Demo2 {
    public static void main(String[] args) throws InterruptedException {
        Thread.sleep(3000);
        System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+"/driver/chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        //浏览器全屏
        driver.manage().window().maximize();
//        driver.manage().window().setPosition(new Point(100, 50));
        driver.manage().deleteAllCookies();
        //与浏览器同步非常重要,必须等待浏览器加载完毕
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://pan.baidu.com/");
        Thread.sleep(1000);
        //找到“QQ账号”登录按钮
        WebElement qqLoginLink = driver
                .findElement(By.xpath("//*[@id=\"pass_phoenix_btn\"]/ul/li[2]/a"));
        qqLoginLink.click();
        Thread.sleep(1000);
        //获取当前页面句柄
        String handle = driver.getWindowHandle();
        //获取所有页面的句柄,并循环判断不是当前的句柄 然后切换到子窗体
        for (String handles : driver.getWindowHandles()) {
            if (handles.equals(handle))
                continue;
            driver.switchTo().window(handles);
        }
        //由于登录输入框在frame中,需要先切换进入frame,否则找不到输入框的
        driver.switchTo().frame(driver.findElement(By.xpath("//*[@id='ptlogin_iframe']")));
        //调试过程中,如果提示找不到元素,不知道是否切换成功了,可以把当前handler的source打印出来看看
//        System.out.println(driver.getPageSource());
        driver.findElement(By.xpath("//*[@id='switcher_plogin']")).click();
        driver.findElement(By.xpath("//*[@id='u']")).sendKeys("xxx");
        driver.findElement(By.xpath("//*[@id='p']")).sendKeys("xxx");
        driver.findElement(By.xpath("//*[@id='login_button']")).click();
        //如果直接关闭,可能被判断为还没完成登录,没有会话,所以稍等片刻
        Thread.sleep(5000);
        //定位到当前最新页面
        Set<String> windows = driver.getWindowHandles();
        driver.switchTo().window((String) windows.toArray()[windows.size() - 1]);
        Thread.sleep(2000);
        //登录后会有一个遮罩层提示,需要先将其关掉
        WebElement kownBtn = driver.findElement(By.xpath("//*[@id=\"dialog1\"]/div[2]/div/div[2]"));
        kownBtn.click();
        Thread.sleep(2000);
        //找到“新建文件夹”按钮
        WebElement newDiskBtm = driver.findElement(By.xpath("//*[@id=\"layoutMain\"]/div[1]/div[2]/div[4]/div[2]/a[1]"));
        newDiskBtm.click();
        Thread.sleep(2000);
        //填入文件夹名称,然后确认新建,完成文件夹新建
        WebElement diskNameInput = driver.findElement(By.xpath("//*[@id=\"layoutMain\"]/div[2]/div[6]/div/input"));
        diskNameInput.sendKeys("我是自动新建的文件夹");
        driver.findElement(By.xpath("//*[@id=\"layoutMain\"]/div[2]/div[6]/div/span[1]")).click();
        Thread.sleep(5000);
        //找到刚刚新建的那个文件夹
        WebElement myAutoDisk = driver.findElement(By.partialLinkText("自动新建"));
        Actions actions = new Actions(driver);
        //鼠标右键单击文件夹
        actions.contextClick(myAutoDisk).perform();
        //在点击右键后弹出来的菜单里找到“删除”,然后点击
        List<WebElement> lis = driver.findElements(By.tagName("li"));
        for (WebElement li : lis) {
            if ("删除".equals(li.getText()))
                li.click();
        }
        Thread.sleep(5000);
        //点击确认框里的“确定”按钮,完成文件夹删除
        driver.findElement(By.linkText("确定")).click();
//        driver.quit();
    }
}

运行结果:

  1. selenium模拟了谷歌浏览器手动输入百度网盘首页链接;

  2. 选择QQ账号方式进行登录,弹出使用QQ登录界面;

  3. 输入账号、密码,点击登录,进入自己的百度网盘;

  4. 点击“新建文件夹”按钮,输入文件夹的名称,完成新建;

  5. 找到刚刚新建的文件夹,点击鼠标右键,弹出右键菜单,在右键菜单里找到“删除”进行点击,然后在弹出的确认删除框里,点击“确定”按钮,完成文件夹删除。

案例3、百度网盘链接内部数据获取

代码如下:

package com.ue.demo;
import com.ue.entity.Article;
import com.ue.util.DateUtil;
import com.ue.util.StringUtil;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.util.HashMap;
import java.util.Map;
/**
 * 百度云链接内部数据获取
 * 链接地址:https://pan.baidu.com/s/1rVgdoLTqsfz9mXZlUqYjSg
 * 提取密码:lt5k
 * @author LiJun
 * @Date 2020年09月03日
 * @Time 18:43
 */
public class Demo3 {
    public static void main(String[] args) {
        String shareUrl = "https://pan.baidu.com/s/1rVgdoLTqsfz9mXZlUqYjSg";
        String password = "lt5k";
        System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "/driver/chromedriver.exe");
        //排除掉图片的加载,提升性能
        Map<String, Object> preferences = new HashMap<String, Object>();
        ChromeOptions options = new ChromeOptions();
        preferences.put("profile.managed_default_content_settings.images", 2);
        options.setExperimentalOption("prefs", preferences);
        WebDriver driver = new ChromeDriver(options);
        driver.get(shareUrl);
        //超时等待
        WebDriverWait wait = new WebDriverWait(driver, 5);
        wait.until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                boolean loadcomplete = d.findElement(By.tagName("body")).isDisplayed();
                return loadcomplete;
            }
        });
        boolean hasPassword = false;//是否有密码
        String title = driver.findElement(By.cssSelector(".pickpw.clearfix")).getText();
        if (StringUtil.isNotEmpty(title) && title.contains("请输入提取码")) {
            hasPassword = true;
        }
        if (hasPassword) {
            WebElement pInput = driver.findElement(By.cssSelector(".QKKaIE.LxgeIt"));
            WebElement btn = driver.findElement(By.cssSelector(".g-button-right"));
            pInput.sendKeys(password);
            btn.click();
        }
        Article article = new Article();
        article.setShare_url(shareUrl);
        article.setPassword(password);
        try {
            genPageData(driver, article);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(article);
//        driver.close();//浏览器关闭
//        driver.quit();//释放资源
    }
    /**
     * 生成基本数据
     */
    public static void genPageData(WebDriver driver, Article article) throws Exception {
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        WebElement fileNameEle = driver.findElement(By.cssSelector(".filename"));
        article.setName(fileNameEle.getText());
        WebElement shareDateEle = driver.findElement(By.cssSelector(".share-file-info span"));
        article.setShare_date(shareDateEle.getText());
        WebElement shareUserEle = driver.findElement(By.cssSelector(".share-person-data-top a.share-person-username.global-ellipsis"));
        article.setShare_user(shareUserEle.getAttribute("textContent"));
        article.setContent(fileNameEle.getText());//预先设置
        article.setState(1);
        article.setInclude_date(DateUtil.getCurrentDateStr());
    }
}

运行结果:

  1. selenium模拟了谷歌浏览器手动输入百度云分享链接;

  2. 打开了需要输入提取码的页面,selenium再次模拟了人工输入百度云链接提取码;

  3. selenium再次模拟了人工点击 ”提取文件” 按钮;

  4. 最后selenium能够如同jsoup一样,分析提取个人所需有用信息;

6.png


作者:今日相乐,皆当喜欢

原文链接:https://blog.csdn.net/weixin_42687829/article/details/108472776

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 在目前的平台项目当中,数据新增或者修改已经是一个必备功能,数据相关的测试就需要关注数据的准确性,除此之外,一些电商搞活动的时候,经常能看到系统bug导致多次支付多次扣款的问题,被客户投诉,这些都指向同一个问题,截流问题,也是本文探讨的重点。1)什么情况下会出现数据重复提交的问题?用户操作系统新增数据,网页卡顿了,页面没有及时变更,没有返回成功的提示,此时又比较着急,这时候可能就会多次点击提交按钮;某些功能添加数据不是一步完成的,通常要分成好几步,用户操作完第一步进入第二步页面的时候,又返回了上一步,这种重复的前进和后退操作也有可能会产生重复数据;用户在提交数据的页面直接刷新,导致页面还是停留在...
            1 1 11750
            分享
          •   “测试自动化测试工程师可以将你从充满代码的世界中拯救出来。”     企业完全同意这一说法,这就是您在自动化测试行业中看到大量就业机会的原因。我在Quora上收到了很多与自动化测试中的职业选择相关的答案请求,以及人们如何在有或没有手动测试经验的情况下适应自动化测试。  在这里,我将详细解释成为测试自动化工程师的七个最重要的步骤。因此,所有希望将职业转向自动化测试的人都要注意所有这些。  1. 不要忽视手动测试  虽然我了解公司正在转向无代码自动化测试工具,达到专家级别并跟上行业自动化测试工程师的竞争,但最初要关注手动测试概念非常重要。  首先,我想强调使用手动和自动测试的事实。有...
            12 14 2153
            分享
          •   界面测试  1、页面布局是否合理。  2、字体大小, 粗细设计是否合理。  3、页面中间的"Baidu 百度" 是否可以正常显示。  4、界面颜色搭配是否合理。  5、页面上方的链接是否都可以正常显示, 是否可以点击。  6、当鼠标放置到链接上 / 百度搜索框上, 是否会从黑色变成蓝色。  7、百度热榜上1, 2, 3 分别显示不同的颜色。  8、百度热榜第一后显示一个 “热” 字。  9、热榜上的每一条新闻是否都可以点击。  10、百度热榜右侧显示 “换一换”, 是否可以点击。  11、百度搜索框中的"相机图标"是否可以正常显示。  12...
            1 1 1400
            分享
          • 1.5. 代码审计1.5.1. 简介代码审计是找到应用缺陷的过程。其通常有白盒、黑盒、灰盒等方式。白盒指通过对源代码的分析找到应用缺陷,黑盒通常不涉及到源代码,多使用模糊测试的方式,而灰盒则是黑白结合的方式。1.5.2. 常用概念1.5.2.1. 输入应用的输入,可以是请求的参数(GET、POST等)、上传的文件、网络、数据库等用户可控或者间接可控的地方。1.5.2.2. 处理函数处理数据的函数,可能是过滤,也可能是编解码。1.5.2.3. 危险函数又常叫做Sink Call、漏洞点,是可能触发危险行为如文件操作、命令执行、数据库操作等行为的函数。1.5.3. 自动化审计一般认为一个漏洞的触发...
            13 13 1349
            分享
          •   一.背景介绍  继自动提交bug到jira文章之后,这时候就会有人有疑问了,我每天都在跑自动化测试(美其名曰每日构建),也每天都在自动提交bug,可能昨天提交的bug尚未解决,今天又重新提了一遍,一周下来累计的bug好几千了,怎么办?一个个去手动过滤,有木有感觉直接崩溃了?那么为了解决这个问题,今天我们就来介绍一个自动化过滤的方案及其实践。  二.测试需求分析  此方案也主要使用python/pytest实现,主要针对于jira上bug的处理,当然也可以使用过滤重复需求,重复任务等等均可以。  准备工作:  1.在处理之前,你首先需要了解部门的jira流转图(不同公司或部门都可能不一样),...
            0 0 847
            分享
      • 51testing软件测试圈微信