selenium4--xpath定位
selenium-xpath定位
element_xpath = driver.find_element(By.XPATH, 'xpath表达式')
xpath定位说明
xpath即为XML路径语言(XML Path Language),是由国际标准化组织W3C指定的,一种用来确定XML文档节点位置的语言
xpath定位优点
1.相较于其他定位方式,可支持更多定位方法,如:布尔逻辑判断、模糊定位等
2.可支持web定位、Android app原生页面定位
xpath定位缺点
1.需要从头到尾解析整个页面,速度较慢
xpath调试方法
方法1:在浏览器开发者模式的elements中,Ctrl+F搜索栏输入xpath表达式
方法2:在浏览器开发者模式的console中,按如下格式可验证表达式
$x("xpath表达式") # 表达式中存在引号,则使用单引号,'$'可更换为'$$'
xpath节点
在xpath中,有七种类型的节点(node):元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)
在开始xpath语法前,我们需要简单了解这几种节点:
|
节点名称 |
说明 |
示例 |
|---|---|---|
|
元素节点 |
网页中的各个标签 |
如\<textarea>...\</textarea>、\<p>...\</p> |
|
根节点 |
网页的第一个元素节点 |
网页的根节点通常为\<html>...\<html> |
|
属性节点 |
标签中的各个属性 |
如\<div id='su' >...\</div>,id即为div节点的属性 |
|
文本节点 |
标签的文本 |
如\<div>啦啦啦\</div>,'啦啦啦'即为div节点的文本 |
xpath语法
<font color='red'>xpath使用路径表达式描述目标节点与网页头的关系</font>
绝对路径 & 相对路径
路径表达式有两种结构,分别为:
- 绝对路径:从根节点/html开始往下,一层层的表示出来直到需要的节点为止。以百度输入框为例,表达式为:/html/body/div[1]/div[2]/div[5]/div[1]/div/form/span[1]//input[@id='su']
- 相对路径:从任意节点开始,根据节点描述信息找到需要的节点。同样以百度输入框为例,表达式为:
对比两种表达式,可以发现:
- 相对路径更简洁,方便阅读
- 相对路径更稳定,当前端页面有结构变动就容易引起绝对路径发生变化
<font color='red'>因此,在项目中几乎都是使用相对路径进行定位</font>
xpath基本表达式
|
表达式 |
说明 |
示例 |
示例说明 |
|---|---|---|---|
|
nodename |
选取此节点的所有子节点 |
html |
选取\<html>根节点的所有子节点 |
|
/ |
从根节点选取,或者用来选择子节点 |
/html/body/textarea |
选择\<body>中的所有\<textarea>子节点 |
|
// |
从匹配节点开始选取,或者选择后代节点 |
/html/body//textarea |
选择\<body>中的所有\<textarea>后代节点 |
|
| |
选择多个节点 |
//div|//a |
选择所有\<div>节点和\<a>节点 |
|
.. |
选择当前节点的父节点 |
//p/.. |
选择所有\<p>的父节点 |
|
* |
选择所有节点 |
/html/body/* |
选择\<body>中的所有节点 |
xpath谓语表达式
谓语表达式(predicate):紧跟在节点后面,嵌入在[]中的一段表达式,可用来筛选多个同名节点
谓语表达式作用原理:获取节点信息,通过表达式判断节点是否符合要求,为True则返回该节点
谓语格式:
节点名称[谓语]
|
常用谓语 |
说明 |
示例 |
示例说明 |
|---|---|---|---|
|
n |
节点编号 |
//div2 |
选择所有\<div>节点且<font color='red'>该节点是其父级的第二个\<div>节点</font> |
|
last() |
最后一个节点 |
//divlast() |
选择所有\<div>节点且<font color='red'>该节点是其父级的最后一个子节点</font> |
|
position() |
比较节点编号 |
//divposition() < 3 |
选择所有\<div>节点且<font color='red'>该节点是其父级的前两个\<div>节点</font> |
|
@属性 |
属性 |
//input@id |
选择所有\<input>节点且该节点带id属性 |
|
@属性='属性值' |
比较属性 |
//input@id='kw' |
选择所有\<input>节点且该节点id属性为'kw' |
|
text() |
比较节点文本 |
//atext()='新闻' |
选择所有\<a>节点且该节点文本为'新闻' |
|
谓语运算符 |
说明 |
示例 |
示例说明 |
|---|---|---|---|
|
= != > < >= <= |
大小比较 |
/html/body/divposition()=2 |
选择\<body>中的第2个\<div>子节点 |
|
+ - *、 div mod |
加减乘除求余 |
/html/body/divlast()-1 |
选择\<body>中的倒数第2个\<div>子节点 |
|
and or not() |
或、且、非运算 |
//*@id='kw' and @class='s_ipt' |
选择所有id='kw'并且class='s_ipt'的节点 |
|
contains() |
包含 |
//*contains(text(), '新闻') |
选择所有文本带有'新闻'二字的节点 |
|
starts-with() |
头部包含 |
//*starts-with(@id, 's') |
选择所有文本以'新闻'开头的节点 |
备注:
- last()、position()、text()、not()这类带有括号的表达式,实质都是xpath提供的函数,本篇文章只列出了常用函数
- 根据W3C标准,第一个节点编号应该是1,但在IE5及更高版本中第一个节点编号是0
xpath轴(axis)
轴:表示所选节点与当前节点之间的树关系,用来筛选对于当前节点有相同关系的一类节点
轴格式:
当前节点/轴名称::节点名称
|
轴 |
说明 |
示例 |
示例说明 |
|---|---|---|---|
|
ancestor |
先辈节点 |
//input@id='kw'/ancestor::\ * |
选择id='kw'的\<input>节点的所有先辈节点 |
|
ancestor-or-self |
先辈节点以及当前节点 |
略 |
略 |
|
attribute |
节点属性 |
略 |
略 |
|
child |
子节点,等同于/ |
/html/body/child::div |
选择\<body>中的所有\<div>子节点 |
|
descendant |
后代节点,等同于// |
/html/body/descendant::div |
选择\<body>中的所有\<div>后代节点 |
|
descendant-or-self |
后代节点以及当前节点 |
略 |
略 |
|
following |
结束标签之后的所有节点 |
略 |
略 |
|
namespace |
命名空间 |
略 |
略 |
|
parent |
父节点 |
略 |
略 |
|
preceding |
开始标签之前的所有节点 |
略 |
略 |
|
preceding-sibling |
当前节点之前的所有同级节点 |
略 |
略 |
|
self |
当前节点 |
略 |
略 |
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

更多推荐
所有评论(0)