9. selenium API 【万字】

目录

1. 元素的定位

1.1 css selector

1.1.1 id 选择器

1.1.2 类选择器

1.1.3 标签选择器

1.1.4 后代选择器

1.2 xpath

1.2.1 相对路径 + 索引

1.2.2 相对路径 + 元素

1.2.3 相对路径 + 通配符

1.2.4 相对路径 + 部分元素定位

1.2.5 相对路径 + 文本定位

1.3 应用:打开百度页面输入软件测试,点击百度一下

2. 操作测试对象

2.1 鼠标点击(click)与键盘输入(sendkeys)

2.2 submit 提交表单

2.3 getAttribute 获取元素文本

2.4 clear 清除输入

3. 添加等待

3.1 sleep 休眠

3.2 隐式等待

4. 打印信息

4.1 打印 url  

4.2 打印 title

5. 浏览器的操作

5.1 浏览器最大化

5.2 浏览器设置大小

5.3 浏览器的前进、后退、刷新

6. 键盘事件

6.1 键盘组合键用法

7. 鼠标事件

8. 定位一组元素


我们先来看一下之前测试环境搭建时的代码:

public class Main {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        // 创建了一个 options 对象,用来给请求设置一些参数

        options.addArguments("--remote-allow-origins=*");
        // 允许所有的请求

        WebDriver webDriver = new ChromeDriver(options);
        // 创建驱动

        webDriver.get("https://www.baidu.com");
        // 打开百度网页

        webDriver.close();
        // 关闭网页
    }
}

运行以上代码就可以直接打开百度的网页。

接下来,基于以上代码我们来学习 selenium 的 API。

1. 元素的定位

对象的定位是自动化测试的核心,要想操作一个对象,首先应该识别这个对象。
webdriver 提供了一系列的对象定位方法,常用的有以下几种:
  • id
  • name
  • class name
  • link text
  • partial link text
  • tag name
  • xpath
  • css selector

我们主要来学习通过 xpath 和 css selector 进行定位。

1.1 css selector
CSS(Cascading Style Sheets) 是一种语言,它被用来描述  HTML 和  XML 文档的表现。
CSS 使用选择器来为页面元素绑定属性。这些选择器可以被  selenium 用作另外的定位策略。
CSS 比较灵活可以选择控件的任意属性,CSS的获取可以用 chrome F12 开发者模式中 Element- 右键 -copy-copy selector 来获取。

1.1.1 id 选择器

#+对应的 id 值

如何通过 id 选择器进行定位呢?

首先,选择我们要定位的元素(此处以搜索框作为被定位的元素),然后,ctrl + f 键,在搜索框中输入:#kw

此时,可以看到通过上下键定位到元素:

1.1.2 类选择器

. + 对应的 class 值

 找到我们需要定位的元素的代码,找到 class 值:

CTRL + F 键输入: .s_ipt

可以看到同样定位到了元素。

1.1.3 标签选择器

标签名

可以看到由于 span 标签特别多,因此无法具体的定位到某一个元素:

 因此,就需要引入我们下面即将说到的后代选择器。

1.1.4 后代选择器

父标签 + 空格 + 子标签 ( + :nth-child(n) )

 :nth-child(n) 是用来具体的定位子标签中的第 n 个。

父标签 + 空格 + 子标签:

父标签 + 空格 + 子标签  + 空格+ id 选择器:

1.2 xpath
XPath 是一种在  XML 文档中定位元素的语言。因为  HTML 可以看做  XML 的一种实现,所以 selenium 用户可使用这种强大语言在 web 应用中定位元素。
XPath 扩展了上面  id 和  name 定位方式,提供了很多种可能性。
XPATH 的获取可以用 chrome F12 开发者模式中 Element- 右键 -copy-copy xpath 来获取。
通过绝对路径进行定位:/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input

通过相对路径进行定位:以双斜杠开头

1.2.1 相对路径 + 索引

//form/span[1]/input[1]                 ---不写下标时默认是 1

1.2.2 相对路径 + 元素

 //span[@id="s-usersetting-top"]

 //span[@class="s-top-right-text c-font-normal c-color-t s-top-right-new"]

1.2.3 相对路径 + 通配符

 //span[@*="s-usersetting-top"]

1.2.4 相对路径 + 部分元素定位

 //input[starts-with(@autocomplete,'of')]

//*[starts-with(@autocomplete,'of')]

starts-with(string1,string2)

string1 以 string 2 开头 

1.2.5 相对路径 + 文本定位

 //a[text()="新闻"]

推荐使用 CSS 选择器定位元素,因为 xpath 定位元素效率非常低(需要将整个页面加载到内存中,然后再去定位元素)。

1.3 应用:打开百度页面输入软件测试,点击百度一下
private static void test02() {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 打开百度界面
        webDriver.get("https://www.baidu.com");
        // 通过 css selector选中搜索框 输入数据“软件测试”
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        // 点击 百度一下 按钮
        // 通过 css selector
        //webDriver.findElement(By.cssSelector("#su")).click();
        // 通过 xpath
        webDriver.findElement(By.xpath("//*[@id=\"su\"]")).click();
    }

运行后,怎么确认搜索出来的结果是正确的呢?

可以看到“软件测试”位于 em  标签中。

测试是否实现以上需求的完整代码如下:

public class Main {
    public static void main(String[] args) throws InterruptedException {
        //test01();  // 打开和关闭网页
        test02();
    }

    private static void test02() throws InterruptedException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 打开百度界面
        webDriver.get("https://www.baidu.com");
        // 通过 css selector选中搜索框 输入数据“软件测试”
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        // 点击 百度一下 按钮
        // 通过 css selector
        //webDriver.findElement(By.cssSelector("#su")).click();
        // 通过 xpath
        webDriver.findElement(By.xpath("//*[@id=\"su\"]")).click();
        // 找到所有的“软件测试”文案对应的元素
        sleep(4000);
        List<WebElement> webElements = webDriver.findElements(By.cssSelector("em"));
        System.out.println(String.valueOf(webElements.size()));
    }

    private static void test01() {
        ChromeOptions options = new ChromeOptions();
        // 创建了一个 options 对象,用来给请求设置一些参数
        options.addArguments("--remote-allow-origins=*");
        // 允许所有的请求
        WebDriver webDriver = new ChromeDriver(options);
        // 创建驱动
        webDriver.get("https://www.baidu.com");
        // 打开百度网页
        webDriver.close();
        // 关闭网页
    }

}

可以看到此时的界面中的“软件测试”文案一共有24个,如果以上代码中不添加休眠的话可能会打印0,因为页面的渲染也是需要一定时间的。

// 如果搜索结果不为0,则测试通过;否则,测试不通过
        if(String.valueOf(webElements.size()).equals(0)){
            System.out.println("测试未通过");
        }else {
            System.out.println("测试通过");
        }

2. 操作测试对象

定位元素是第一步,在定位元素后,需要对这个元素进行进一步的操作。

webdriver 中比较常用的操作对象的方法有下面几个:
  • click 点击对象
  • sendkeys 在对象上模拟按键输入
  • clear 清除对象输入的文本内容
  • submit 提交
  • getAttribute 用于获取元素的文本信息
2.1 鼠标点击(click)与键盘输入(sendkeys)

上述通过百度进行搜索的案例即是。

2.2 submit 提交表单

点击的元素必须放到 form 标签中,但是 click 没有要求。

可以看到“百度一下”按钮位于 form 表单中:

因此,我们可以直接将 click 方法替换为 submit 方法:

接下来,我们对于不在 form 标签中的元素使用 submit 方法验证一下:

private static void test04() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).submit();
    }

可以看到不在 from 标签内的元素是无法使用 submit 方法的。

2.3 getAttribute 获取元素文本
private static void text03() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("test");
    }

执行以上代码,可以看到已经输入了“test”:

 此时运行代码:

webDriver.findElement(By.cssSelector("#su")).click();

可以看到已经将对应的结果搜索出来了:

 接下来,定位想要获取的文本内容:

接下来将 value 的值,添加到 getAttribute 方法中:

String search_result = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");

可以看到上图成功打印了结果。

2.4 clear 清除输入
private static void test05() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(2000);
        webDriver.findElement(By.cssSelector("#kw")).clear();
    }

3. 添加等待

3.1 sleep 休眠

如上述代码中的 sleep(2000); 我们只需要将异常抛出即可。

3.2 隐式等待
通过添加  implicWait() 方法就可以方便的实现智能等待。
  implicWait() 的用法比 sleep() 更智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
private static void test06() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        webDriver.findElement(By.cssSelector("#su")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);
        webDriver.findElement(By.cssSelector("#kw")).clear();
        webDriver.quit();
    }

在代码中,我们设置了让程序等待 3 天再退出,然而在运行代码后发现,程序运行结束后就立刻退出了。

隐式地等待并非一个固定的等待时间,当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长。

4. 打印信息

4.1 打印 url  
private static void test07() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        // 如果当前页面的 url 等于 https://www.baidu.com 则测试通过
        String url = webDriver.getCurrentUrl();
        System.out.println(url);
        if(url.equals("https://www.baidu.com/")){
            System.out.println("测试通过");
        }else{
            System.out.println("测试不通过");
        }
        webDriver.quit();
    }

4.2 打印 title

private static void test08() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        String title = webDriver.getTitle();
        System.out.println(title);
        if(title.equals("百度一下,你就知道")){
            System.out.println("测试通过");
        }else{
            System.out.println("测试不通过");
        }
        webDriver.quit();
    }

5. 浏览器的操作

5.1 浏览器最大化
private static void test09() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        // 浏览器最大化
        //webDriver.manage().window().maximize(); 
        // 浏览器全屏
        webDriver.manage().window().fullscreen(); 
        
    }
5.2 浏览器设置大小
webDriver.manage().window().setSize(new Dimension(500,500));

5.3 浏览器的前进、后退、刷新
private static void test10() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        // 后退
        webDriver.navigate().back();
        sleep(3000);
        // 前进
        webDriver.navigate().forward();
        sleep(3000);
        // 刷新
        webDriver.navigate().refresh();
    }

6. 键盘事件

6.1 键盘组合键用法
private static void test11() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        // 按下 CTRL + A
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL + "A");
        sleep(3000);
        // 按下 CTRL + X
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL + "X");
        sleep(3000);
        // 按下 CTRL + V
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL + "V");
        sleep(3000);
        webDriver.findElement(By.cssSelector("#su")).click();
    }

7. 鼠标事件

 private static void test12() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        webDriver.findElement(By.cssSelector("#su")).click();
        Actions actions = new Actions(webDriver);
        // 智能等待三秒
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        // 将鼠标移动到对用的元素上
        WebElement target = webDriver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-wenku_GwhrW.s-tab-wenku"));
        actions.moveToElement(target);
        // 对元素进行右击
        actions.contextClick(target).perform();
    }

8. 定位一组元素

我们先运行一段 HTML 的代码:

<html>
<head>
  <meta http-equiv="content-type" content="text/html;charset=utf-8" />
  <title>Checkbox</title>
</head>
<body>
<h3>checkbox</h3>
<div class="well">
  <form class="form-horizontal">
    <div class="control-group">
      <label class="control-label" for="c1">checkbox1</label>
      <div class="controls">
        <input type="checkbox" id="c1" />
      </div>
    </div>
    <div class="control-group">
      <label class="control-label" for="c2">checkbox2</label>
      <div class="controls">
        <input type="checkbox" id="c2" />
      </div>
    </div>
    <div class="control-group">
      <label class="control-label" for="c3">checkbox3</label>
      <div class="controls">
        <input type="checkbox" id="c3" />
      </div>
    </div>
    <div class="control-group">
      <label class="control-label" for="r">radio</label>
      <div class="controls">
        <input type="radio" id="r1" />
      </div>
    </div>
    <div class="control-group">
      <label class="control-label" for="r">radio</label>
      <div class="controls">
        <input type="radio" id="r2" />
      </div>
    </div>
  </form>
</div>
</body>
</html>

 运行后,出现如上图所示界面。接下来在这个界面我们进行操作:

radio -- 单选;checkbox -- 复选框

 接下来,我们选中页面上的所有复选框:

private static void page01() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("http://localhost:63342/Main.java/Page/tset01.html?_ijt=rk0f3bk1bgfmi7vnh9pdja1905&_ij_reload=RELOAD_ON_SAVE");
        // 获取到 input 标签下的所有元素
        List<WebElement> webElements = webDriver.findElements(By.cssSelector("input"));
        for (int i = 0; i < webElements.size(); i++) {
            if(webElements.get(i).getAttribute("type").equals("radio")){

            }else{
                webElements.get(i).click();
            }

        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值