xpath定位元素
- 环境和工具说明
- 基础语法
- 常用的使用实例
- 选择有某属性的节点
- 选择不包含某属性的节点
- 选择包含某属性,并且属性值是等于情况的节点
- 选择包含某属性,并且属性值是包含情况的节点
- 选择不包含某属性是某个值的情况
- 选择某元素下指定元素的第n个节点
- 选择某元素下指定元素的最后一个节点
- 选择某元素下指定元素的倒数第二一个节点
- 选择某元素下指定元素的前n个节点
- 选择以什么开头的节点(starts-with),使用方法和contains一样
- 选择以什么结尾的节点(ends-with),使用方法和contains一样(验证时不能定位到元素,有说是不支持2.0的语法
- 多个属性取和
- 多个属性取或
- 选择属性值大于多少的节点
- 选取当前节点之前的所有同级节点
- 选取当前节点的开始标签之前的所有节点。
- 选择相邻节点的前一位
- 选择相邻节点的后一位
- 选择相邻节点的前N位/后N位
selenium做ui自动化时,需要掌握的基础知识就是元素定位,元素定位有很多做方式,比如id、css选择器,tagname、xpath等。
自己比较喜欢用xpath的方式,总结一下如何通过xpath进行元素定位
环境和工具说明
验证环境:百度首页
xpath:2.0版本
工具:chrome的F12 ->elements中查询写好的xpath,显示匹配的元素,如图所示
基础语法
表达式 | 描述 |
---|---|
/ | 从根节点选取,绝对路径 |
// | 从选择的当前节点选择,相对路径 |
. | 选择当前节点 |
. . | 选择父节点 |
@ | 选择属性 |
常用的使用实例
选择有某属性的节点
eg:选择有target属性的a元素
//a[@target]
或者
//a/attribute::target
选择不包含某属性的节点
eg: 选择没有type属性的input标签
//input[not(@type)]
选择包含某属性,并且属性值是等于情况的节点
eg:选择target属性值是_blank的a元素
//a[@target='_blank']
或者(target属性值只有一个时这两个方法通用,但有多个值时,下面这种方法匹配的结果比上面这种方法多)
//a[contains(@target,'_blank')]
选择包含某属性,并且属性值是包含情况的节点
eg:选择target属性值包含_blank的的a元素
//a[contains(@target,'_blank')]
选择不包含某属性是某个值的情况
eg:选择target属性值不包含_blank的的a元素
//a[not(contains(@target,'_blank'))]
选择某元素下指定元素的第n个节点
eg:选择form标签下第一个input标签
//form/input[1]
或者
//form/input[position()=1]
eg:选择form标签下第三个input标签
//form/input[position()=3]
选择某元素下指定元素的最后一个节点
eg:选择form标签下最后一个input标签
//form/input[last()]
选择某元素下指定元素的倒数第二一个节点
eg:选择form标签下倒数第二个input标签
//form/input[last()-1]
选择某元素下指定元素的前n个节点
eg:选择form标签下前两个inpu标签
//form/input[position()<3]
选择以什么开头的节点(starts-with),使用方法和contains一样
eg:选择以百度开头的a标签
//a[starts-with(.,'百度')]
选择以什么结尾的节点(ends-with),使用方法和contains一样(验证时不能定位到元素,有说是不支持2.0的语法
eg:选择以百度结尾的a标签
//a[ends-with(.,'百度')]
多个属性取和
eg:选择from标签下,type属性值为hidden,name属性值是ie的input标签
//form/input[@type='hidden' and @name='ie']
多个属性取或
eg:选择from标签下,name属性值为f或者ie的input标签
//form/input[@name='f' or @name='ie']
选择属性值大于多少的节点
eg:选择ul标签下,data-index属性值大于3的li标签
//ul/li[@data-index>3]
选取当前节点之前的所有同级节点
eg:选择value属性值是baidu的input标签的同级input标签
//input[@value='baidu']/preceding-sibling::input
选取当前节点的开始标签之前的所有节点。
eg:选择value属性值是baidu的input标签之前的所有input标签
//input[@value='baidu']/preceding::input
区别:preceding-sibling只能查询同级的,preceding可以查询出同级节点的子节点
如图
选择相邻节点的前一位
eg:选择value属性值是baidu的input标签相邻的前一位input标签
//input[@value='baidu']/preceding-sibling::input[1]
选择相邻节点的后一位
eg:选择value属性值是baidu的input标签相邻的后一位input标签
//input[@value='baidu']/following-sibling::input[1]
选择相邻节点的前N位/后N位
选择value属性值是baidu的input标签相邻的前(后)N位input标签
//input[@value='baidu']/following-sibling::input[N]
更详细,更多的用法,详见参考地址:https://www.w3school.com.cn/xpath/xpath_syntax.asp