第 4 章 WebDriver API - Selenium3 自动化测试

第 4 章 WebDriver API

从本章开始正式学习 WebDriver API,它可用来操作浏览器元素的一些类和方法

4.1 从定位元素开始

例如百度的首页,页面上有输入框、按钮、文字链接、图片等元素。自动化测试要做的就是模拟鼠标和键盘来操作这些元素,如单击、输入、鼠标悬停等。
而操作这些元素的前提是要定位它们。自动化工具,如何定位这些元素呢?
通过浏览器自带的(F12)开发者工具可以看到,页面元素都是由 HTML 代码组成的,它们之间有层级地组织起来,每个元素有不同的标签名和属性值。WebDriver 就是根据这些信息来定位元素的。

WebDriver 提供了 8 种元素定位方法,在 Python 中,对应的方法如下:

● id 定位 → find_element_by_id()
● name 定位 → find_element_by_name()
● tag 定位 → find_element_by_tag_name()
● class 定位 → find_element_by_class_name()
● link_text → find_element_by_link_text()
● partial link 定位 → find_element_by_partial_link_text()
● XPath 定位 → find_element_by_xpath()
● CSS_selector 定位 → find_element_by_css_selector()

4.1.1 id 定位

HTML 规定,id 在 HTML 文档中必须是唯一的,这类似于我国公民的身份证号,具有唯一性。WebDriver 提供的 id 定位方法是通过元素的 id 来查找元素的。通过 id 定位百度输入框与百度搜索按钮的用法如下。

第 4 章 WebDriver API - Selenium3 自动化测试

find_element_by_id()方法是通过 id 来定位元素的。

4.1.2 name 定位

HTML 规定,name 用来指定元素的名称,因此它的作用更像是人的姓名。通过 name 定位百度输入框的用法如下。

第 4 章 WebDriver API - Selenium3 自动化测试

find_element_by_name()方法是通过 name 来定位元素的。

4.1.3 class 定位

HTML 规定,class 用来指定元素的类名,其用法与 id、name 类似。通过 class 定位百度输入框的用法如下。

第 4 章 WebDriver API - Selenium3 自动化测试

find_element_by_class_name()方法是通过 class 来定位元素的。

4.1.4 tag 定位

HTML 通过 tag 来定义不同页面的元素。例如,<input> 一般用来定义输入框,<a> 标签用来定义超链接等。不过,因为一个标签往往用来定义一类功能,所以通过标签识别单个元素的概率很低。例如,我们打开任意一个页面,查看前端代码时都会发现大量的 <div>、<input>、<a> 等标签。
通过标签名(tag name)定位百度输入框的用法如下。
find_element_by_tag_name()方法是通过元素的标签名来定位元素的。

4.1.5 link 定位

link 定位与前面介绍的几种定位方法有所不同,它专门用来定位文本链接。百度输入框上面的几个文字链接的代码如下。

第 4 章 WebDriver API - Selenium3 自动化测试

查看上面的代码可以发现,通过 name 定位是个不错的选择。不过这里为了演示 link 定位的使用,现给出通过 link 定位链接的用法如下。

第 4 章 WebDriver API - Selenium3 自动化测试

find_element_by_link_text()方法是通过元素标签对之间的文字信息来定位元素的。

4.1.6 partial link 定位

partial link 定位是对 link 定位的一种补充,有些文字链接比较长,这个时候我们可以取文字链接的部分文字进行定位,只要这部分文字可以唯一地标识这个链接即可。

第 4 章 WebDriver API - Selenium3 自动化测试

通过 partial link 定位链接的用法如下。

第 4 章 WebDriver API - Selenium3 自动化测试

find_element_by_partial_link_text()方法是通过元素标签对之间的部分文字定位元素的。

前面介绍的几种定位方法相对来说比较简单,在理想状态下,一个页面当中每个元素都有唯一的 id 值和 name 值,可以通过它们来查找元素。但在实际项目中并非想象得这般美好,有时候一个元素没有 id 值和 name 值,或者页面上有多个元素属性是相同的;又或者 id 值是随机变化的,在这种情况下,如何定位元素呢?
下面介绍 XPath 定位与 CSS 定位,与前面介绍的几种定位方式相比,它们提供了更加灵活的定位策略,可以通过不同的方式定位想要的元素。

4.1.7 XPath 定位

因为 HTML 可以看作 XML 的一种实现,在 XML 文档中,XPath 是一种定位元素的语言。所以 WebDriver 提供了这种在 Web 应用中定位元素的方法。

1.绝对路径定位

XPath 有多种定位策略,最简单直观的就是写出元素的绝对路径。如果把元素看作人,假设这个人没有任何属性特征(手机号、姓名、身份证号),但这个人一定存在于某个地理位置,如 xx 省 xx 市 xx 区 xx 路 xx 号。对于页面上的元素而言,也会有这样一个绝对地址。
参考F12开发者工具所展示的代码层级结构,我们可以通过下面的方式找到百度输入框和百度搜索按钮。

第 4 章 WebDriver API - Selenium3 自动化测试

find_element_by_xpath()方法是用 XPath 来定位元素的。这里主要用标签名的层级关系来定位元素的绝对路径,最外层为 html,在 body 文本内,一级一级往下查找。如果一个层级下有多个相同的标签名,那么就按上下顺序确定是第几个。例如,div[2]表示当前层级下第二个 div 标签。

2.利用元素属性定位

除使用绝对路径外,XPath 还可以使用元素的属性值来定位。

第 4 章 WebDriver API - Selenium3 自动化测试

//input 表示当前页面某个 input 标签,[@id=‘kw‘] 表示这个元素的 id 值是 kw。下面通过 name 和 class 来定位。

第 4 章 WebDriver API - Selenium3 自动化测试 

如果不想指定标签名,那么可以用星号(*)代替。当然,使用 XPath 不局限于 id、name 和 class 这三个属性值,元素的任意属性都可以使用,只要它能唯一标识一个元素

第 4 章 WebDriver API - Selenium3 自动化测试

3.层级与属性结合

如果一个元素本身没有可以唯一标识这个元素的属性值,那么我们可以查找其上一级元素。如果它的上一级元素有可以唯一标识属性的值,就可以拿来使用。参考 baidu.html 文本。

第 4 章 WebDriver API - Selenium3 自动化测试
假如百度输入框没有可利用的属性值,那么可以查找它的上一级属性。例如,小明刚出生的时候没有名字,也没有身份证号,那么亲朋好友来找小明时可以先找到小明的爸爸,因为他爸爸是有很多属性特征的。找到小明的爸爸后,就可以找到小明了。通过 XPath 描述如下:

第 4 章 WebDriver API - Selenium3 自动化测试
//span[@class=‘s_ipt_wr‘] 通过 class 定位到父元素,后面的/input 表示父元素下面的子元素。如果父元素没有可利用的属性值,那么可以继续向上查找父元素的父元素。

我们可以通过这种方法一级一级向上查找,直到找到最外层的 <html> 标签,那就是一个绝对路径的写法了。

4.使用逻辑运算符

如果一个属性不能唯一区分一个元素,那么我们可以使用逻辑运算符连接多个属性来查找元素。

第 4 章 WebDriver API - Selenium3 自动化测试

and 表示必须满足两个条件来定位元素。

5.使用 contains 方法

contains 方法用于匹配一个属性中包含的字符串。例如,span 标签的 class 属性为「bg s_ipt_wr」。

第 4 章 WebDriver API - Selenium3 自动化测试

contains 方法只取了 class 属性中的「s_ipt_wr」部分。

6.使用 text()方法

text()方法用于匹配显示文本信息。例如,前面通过 link text 定位的文字链接。

第 4 章 WebDriver API - Selenium3 自动化测试

当然,contains 和 text()也可以配合使用。

第 4 章 WebDriver API - Selenium3 自动化测试

它实现了 partial link 定位的效果。

第 4 章 WebDriver API - Selenium3 自动化测试

上一篇:DATASNAP ISAPI中间件


下一篇:c#创建并设置应用程序池 ---转载