目录
做UI自动化时不可缺少的技能之一就是定位页面的元素,从而获取自己想要的数据。常用定位方式:
一、id定位
id 在HTML文档中必须是唯一的,Webdriver提供的id定位方法是通过元素的id来查找元素的。通过id定位百度输入框用法:
find_element_by_id("kw")
二、name定位
HTML文档中,name是用来指定元素名称,通过name来定位百度输入框的用法:
find_element_by_name("wd")
但是在比较复杂的HTML文档中,name可能不是唯一的,因此该定位方式就会显得不太适用
三、Xpath定位
在XML文档中,xpath是一种定位元素的语言。因为HTML可看做XML的一种,所以可以通过xpath进行定位,该定位方式也是我最喜欢的定位方式
3.1 通过绝对路径定位
绝对路径定位方式是从HTML文件的根节点开始一个一个节点的往下找,表达式一般很长
3.2 利用元素属性定位
除使用绝对路径外,可通过元素属性值来定位
find_element_by_xpath("//input[@id='kw']")
find_element_by_xpath("//input[@name='wd']")
上边两个表达式定位是同一个元素,//input表示当前页面的input标签,[@id='kw']表示这个元素的id值是kw
如果不想指定标签名,可以使用*代替
3.3 层级和属性结合
如果一个元素本身没有可以唯一标识这个元素的属性值,那么可以查找其上一级的元素,如果上一级的元素有唯一标识的值就可以拿来用,参考百度网页,定位百度一下输入框
find_element_by_xpath('//span[@class="bg_s_ipt_wr"]/input')
3.4 使用逻辑运算符
如果一个属性不能唯一区分一个元素,那么我们就可以使用逻辑运算符连接多个属性来查找元素
find_element_by_xapth("//input[@id='kw' and @class='s_ipt']")
and标识必须满足两个条件来定位元素
3.5 使用contains 方法
contains方法用于匹配一个属性中包含的字符串。例如,span标签的class属性为"bgs_ipt_wr"
find_element_by_xpath("//span[contains(@class, 's_ipt_wr)]")
find_element_by_xpath("//input[contains(text(), '百度一下')]") ##通过标签文本包含内容定位
3.6 使用starts_with和ends_with方法
driver.find_element_by_xpath("//a[starts-with(@rel, ‘nofo’)]")
## 定位所有的属性rel以nofo开始的a标签
driver.find_element_by_xpath("//a[ends_with(@rel,'fo')]")
## 定位所有属性rel以fo结尾的a标签
3.7 使用text()方法
text()方法用于匹配显示文本信息
driver.find_element_by_xpath("//input[text()='百度一下']")
text()方法是精确匹配,contains是模糊匹配
3.8 利用父节点定位子节点
<html>
<body>
<div id="A">
<!--父节点定位子节点-->
<div id="B">
<div>parent to child</div>
</div>
</div>
</body>
</html>
根据节点B定位无id的子节点
driver.find_element_by_xpath("//div[@id='B']/child::div").text
3.9 利用父节点定位子节点
<html>
<body>
<div id="A">
<!--子节点定位父节点-->
<div>
<div>child to parent
<div>
<div id="C"></div>
</div>
</div>
</div>
</div>
</body>
</html>
根据C节点定位其两层父节点的div
driver.find_element_by_xpath("//div[@id='C']/parent::*/parent::div").text
4.0 利用弟弟节点定位哥哥节点
<html>
<body>
<div>
<!--下面两个节点用于兄弟节点定位-->
<div>brother 1</div>
<div id="D"></div>
<div>brother 2</div>
</div>
</body>
</html>
根据D节点定位其哥哥节点
driver.find_element_by_xpath("//div[@id='D']/preceding-sibling::div[1]").text
4.1 利用哥哥节点定位弟弟节点
HTML与4.0一样,通过D节点定位其弟弟节点
driver.find_element_by_xpath("//div[@id='D']/following-sibling::div[1]").text
driver.find_element_by_xpath("//div[@id='D']/following::*").text
获取定位元素的属性和内容方式:
1、取文本
driver.find_element_by_xpath('//div[@id="u1"]/a[5]/text()')
2、取元素属性值
driver.find_element_by_xpath('//div[@id="u1"]/a[5]/@href')