5.5 Selenium2中的元素定位
WebDriver的更加面向对象的方式大大降低了Selenium的入门门槛,对Web元素的操作也非常之简单易学。实际项目用起来,工作量最大的部分就是你如何解析定位到你的目标项目页面中的各种元素。好比你要定位一个Button,你可以用ID,可以用CSS,可以用XPATH,你为了点击这个Button,写了一个函数调用Selenium里的API,即WebElement里的click()或者submit(),那么另外一个Button怎么办?成百上千个Button又怎么办?
所以,你需要有一套自己实现的算法或者封装,来根据项目页面的特点提供一套通用的元素定位方式。当你的通用定位逻辑能准确的找到任何一个元素的时候,剩下的事情就顺理成章了,交给Selenium WebElement的API就可以了。这一套定位逻辑笔者觉得才是使用Selenium做Web自动化工作量最大的部分。当然有的公司Web项目使用了自己开发的UI框架,例如笔者所在的公司,这样Web元素的定位规则和算法就比较容易设计。如果Web项目开发出来的页面代码比较杂乱无章,那么你就需要更加高明和严谨的逻辑去寻找你想要操作和查看的元素了!
一般公司在使用时会设计并封装了一套通用的API,去智能的定位页面中的各种类型的元素。比如项目里的页面有大量的dialog和wizard,都是用div+css实现的。我就提供了一个dialog组件,带有next(),save(),finish(),click(String buttonName),cancel()等方法,然后根据遮罩层和loading Icon的时间来追踪操作完成的进度。这里只是举个小小的例子,有机会再分享更多的细节。
可以看出元素定位是自动化测试的根本,只有先定位元素,才能准确的操作测试对象。在自动化测试实施过程中,测试程序中常用的页面元素操作步骤如下:
(1)定位网页上的页面元素,并存储到到一个变量中。
(2)对变量中存储的页面元素对象进行操作,例如,单击链接、选择下拉列表或在输入框中输入文字等。
(3)设定页面元素的操作值,例如,选择下拉列表中的哪个下拉列表项或在输入框中输入什么字符。
执行以上3个步骤,可以完成对页面元素的自动化操作,其中定位页面元素是第一个步骤,若无法定位页面元素,后面两个步骤也无法完成。在自动化测试实践过程中,由于网页技术的实现过于复杂,经常造成各种页面元素难以定位,常常有人绞尽脑汁也无法定位在页面上显示的页面元素。
元素定位的写法,尽量少依赖已有元素,增加通用性,以适应前端代码可能改变的情况。
5.5.1 定位方法汇总
WebDriver对象的findElement函数可用于定位一个页面元素,findElements函数可用于定位多个页面元素,定位到的页面元素需使用WebElement对象进行存储,以便在测试程序中继续使用。

常用的定位页面元素的方法如下表。
| 定位方法 | 定位方法的Java语言实现实例 |
| 使用ID定位 | driver.findElement(By.id("ID值")); |
| 使用name定位 | driver.findElement(By.name("name值")); |
| 使用链接的全部文字定位 | driver.findElement(By.linkText("链接的全部文字内容")); |
| 使用部分链接文字定位 | driver.findElement(By.partialLinkText("链接的部分文字内容")); |
| 使用XPath方式定位 | driver.findElement(By.xpath("XPath定位表达式")); |
| 使用CSS方式定位 | driver.findElement(By.cssSelector("CSS定位表达式")); |
| 使用Class名称定位 | driver.findElement(By.className("页面元素的Class属性值")); |
| 使用标签名称定位 | driver.findElement(By.tagName("页面中的HTML标签名称")); |
| 使用jQuery方式 | js.executeScript("return jQuery.find('jQuery定位表达式')"); |
5.5.2 ID定位
被测试网页的HTML代码:
<html>
<body>
<label>用户名</label>
<input id="username"></input>
<label>密码</label>
<input id="password"></input>
<br>
<button id="submit>登录</button>
</body>
</html>
定位语句代码如下:
WebElement username=driver.findElement(By.id("username"));
WebElement password=driver.findElement(By.id("password"));
WebElement submit=driver.findElement(By.id("submit"));
由于页面元素的ID属性在当前网页中是唯一的,所以使用ID值定位可以保证定位的唯一性,不会像其他定位方式一样可能定位到多个页面元素。因此,在自动化测试的实践过程中,可以和页面开发工程师约定所有的核心页面元素均需增加ID值,以此提高网页程序的可测试性,降低自动化测试实施的难度。
5.5.3 name定位
被测试网页的HTML代码:
<html>
<body>
<label>用户名</label>
<input name="username"></input>
<label>密码</label>
<input name="password"></input>
<br>
<button name="submit>登录</button>
</body>
</html>
定位语句代码如下:
WebElement username=driver.findElement(By.name("username"));
WebElement password=driver.findElement(By.name("password"));
WebElement submit=driver.findElement(By.name("submit"));
使用name方式定位可能会同时定位到多个元素,还需要进一步定位才能获取实施测试操作的唯一页面元素。
5.5.4 全部链接文字定位
被测试网页的HTML代码:
<html>
<body>
<a href="http://www.sogou.com">sogou搜索</a><br/>
<a href="http://www.baidu.com">baidu搜索</a>
</body>
</html>
定位语句代码:
WebElement link=driver.findElement(By.linkText("sogou搜索"));
使用此方式定位链接需要完全匹配链接的显示文字,否则无法找到链接。
5.5.5 部分链接文字定位
被测试网页的HTML代码:
<html>
<body>
<a href="http://www.sogou.com">sogou搜索</a><br/>
<a href="http://www.baidu.com">baidu搜索</a>
</body>
</html>
定位语句代码:
WebElement link=driver.findElement(By.partialLinkText("sogou搜索"));
List<WebElement> links=driver.findElements(By.partialLinkText("搜索"));
第一行代码定位到了多个包含"sog"字母的链接,则会将第一个匹配的对象赋值给link变量。
第二行代码会存储多个链接对象到link集合中。
5.5.6 标签定位
被测试网页的HTML代码:
<html>
<body>
<a href="http://www.sogou.com">sogou搜索</a><br/>
<a href="http://www.baidu.com">baidu搜索</a>
</body>
</html>
定位语句代码:
WebElement link=driver.findElement(By.tagName("a"));
List<WebElement> links=driver.findElements(By.tagName("a"));
标签名称的定位方式主要用于匹配多个页面元素的情况,将查找到的网页元素对象进行计数、遍历、修改属性等操作。
5.5.7 Class定位
被测试网页的HTML代码:
<html>
<head>
<style type="text/css">
input.spread{FONT-SIZE:20pt;}
input.tight{FONT-SIZE:10pt;}
</style>
</head>
<body>
<input class="spread" type=text></input>
<input class="tight" type=text></input>
</body>
</html>
定位语句代码:
WebElement input=driver.findElement(By.className("tight"));
可以根据class属性值来查找一个或者一组显示效果相同的页面元素。
5.5 Selenium2中的元素定位的更多相关文章
- 关于CSS中的元素定位
---恢复内容开始--- CSS 定位和浮动 CSS 为定位和浮动提供了一些属性,利用这些属性,可以建立列式布局,将布局的一部分与另一部分重叠,还可以完成多年来通常需要使用多个表格才能完成的任务. 定 ...
- Python自动化中的元素定位xpath(二)
1.Xpath元素定位 1)ele = b.find_element_by_xpath(‘/html/body/from/input[1]’) 2)Ele = b.find_element_by_xp ...
- Python自动化中的元素定位(一)
1.使用selenium中的webdriver模块对浏览器进行操作 1)from selenium import webdriver 加载模块 2)b = webdriver.Friefox() 打开 ...
- 【appium】appium中的元素定位和基本操作
# coding=utf-8 from appium import webdriver import time from selenium.webdriver.support.ui import We ...
- HTML中的元素定位
static默认 relative相对定位 absolute绝对定位 mix relative and absolute混合相对定位和绝对定位 fixed固定定位 float浮动 reference ...
- Selenium2学习-002-Selenium2 Web 元素定位及 XPath 编写演示示例
此文主要对 Selenium2 的 Web 元素定位及 XPath 编写示例,敬请各位亲们参阅,共同探讨.若有不足之处,敬请各位大神指正,不胜感激! 通过 Firefox(火狐)浏览器的插件 Fire ...
- selenium 中在 iframe 内的元素定位
有些时候 元素明明就在 但是通过什么方式定位都提示 定位不到元素 此时就要考虑元素是不是内嵌在iframe 中 对于内嵌在 ifra中的元素定位 首先定位到 iframe 元素 例如 iframe = ...
- 元素定位-XPATH定位方法总结
1.Xpath定位方法探讨 xpath是比较常用的一种定位元素的方式,因为它很方便,缺点是,消耗系统性能.如果Xpath使用的比较好,几乎可以定位到任何页面元素,而且受页面变化影响较小. 1.1.什么 ...
- 【转载】Xpath定位方法深入探讨及元素定位失败常见情况
一.Xpath定位方法深入探讨 (1)常用的Xpath定位方法及其特点 使用绝对路径定位元素. 例如: driver.findElement(By.xpath("/html/body/div ...
随机推荐
- Struts2的标签库(五)——表单标签
Struts2的标签库(五) --表单标签 几个特殊的表单标签的使用: 1.checkboxlist标签 该标签用于创建多个复选框,用于同时生成多个<input type="check ...
- 关于mysql varchar 类型的最大长度限制
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This ...
- 【leetcode❤python】242. Valid Anagram
class Solution(object): def isAnagram(self, s, t): if sorted(list(s.lower()))==sorted(list ...
- BZOJ 2758 Blinker的噩梦(扫描线+熟练剖分+树状数组)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2758 题意:平面上有n个多边形(凸包和圆).任意两个多边形AB只有两种关系:(1) ...
- Sql合并两个select查询
现有2个查询,需要将每个查询的结果合并起来(注意不是合并结果集,因此不能使用union),可以将每个查询的结果作为临时表,然后再从临时表中select所需的列,示例如下: SELECT get.d ...
- 基于ADL5317的雪崩光电二极管(APD)偏压控制/光功率监测电路的设计
1 引言 目前,雪崩光电二极管(APD)作为一种高灵敏.能精确接收数据和测量光功率的光探测器件广泛应用于光纤传感.光纤通信网络中.它借助于内部强电场作用产生雪崩倍增效应,具有极高的内部增益(可达102 ...
- struts2——通配符
struts2的配置文件是 struts.xml.. 在这个配置文件里面可以使用通配符..其中的好处就是,大大减少了配置文件的内容..当然,相应付出的代价是可读性.. 使用通配符的原则是 约定高于配置 ...
- sql 相关子查询
子查询:嵌套在其他查询中的查询. 子查询有称内部查询,而包含子查询的语句称之为外部查询 所有的子查询可以分两类,既 相关子查询和非相关子查询 1>非相关子查询是独立于外部查询的子查询,子查询总共 ...
- SQL函数学习(十九):CAST()函数和CONVERT()函数
19.CAST()函数和CONVERT()函数 CAST()函数可以将某种数据类型的表达式转化为另一种数据类型 CONVERT()函数 也 可以将指定的数据类型转换为另一种数据类型 19.1 CAST ...
- SAP传输系统TMS、开发类、传输请求
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...