selenium xpath定位

selenium-xpath定位

复制代码
<span style="background-color:#2d2d2d"><span style="color:#cccccc"><code class="language-javascript">element_xpath <span style="color:#67cdcc">=</span> driver<span style="color:#cccccc">.</span><span style="color:#f08d49">find_element</span><span style="color:#cccccc">(</span>By<span style="color:#cccccc">.</span><span style="color:#f8c555">XPATH</span><span style="color:#cccccc">,</span> <span style="color:#7ec699">'xpath表达式'</span><span style="color:#cccccc">)</span>
</code></span></span>

xpath定位说明

xpath即为XML路径语言(XML Path Language),是由国际标准化组织W3C指定的,一种用来确定XML文档节点位置的语言

xpath定位优点

1.相较于其他定位方式,可支持更多定位方法,如:布尔逻辑判断、模糊定位等
2.可支持web定位、Android app原生页面定位

xpath定位缺点

1.需要从头到尾解析整个页面,速度较慢

xpath调试方法

方法1:在浏览器开发者模式的elements中,Ctrl+F搜索栏输入xpath表达式
方法2:在浏览器开发者模式的console中,按如下格式可验证表达式

复制代码
<span style="background-color:#2d2d2d"><span style="color:#cccccc"><code class="language-javascript"><span style="color:#f08d49">$x</span><span style="color:#cccccc">(</span><span style="color:#7ec699">"xpath表达式"</span><span style="color:#cccccc">)</span>   # 表达式中存在引号,则使用单引号,<span style="color:#7ec699">'$'</span>可更换为<span style="color:#7ec699">'$$'</span>
</code></span></span>

xpath节点

在xpath中,有七种类型的节点(node):元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)
在开始xpath语法前,我们需要简单了解这几种节点:

节点名称 说明 示例
元素节点 网页中的各个标签 如<textarea>...</textarea>、<p>...</p>
根节点 网页的第一个元素节点 网页的根节点通常为<html>...<html>
属性节点 标签中的各个属性 如<div id='su' >...</div>,id即为div节点的属性
文本节点 标签的文本 如<div>啦啦啦</div>,'啦啦啦'即为div节点的文本

xpath语法

xpath使用路径表达式描述目标节点与网页头的关系

绝对路径 & 相对路径

路径表达式有两种结构,分别为:

  • 绝对路径:从根节点/html开始往下,一层层的表示出来直到需要的节点为止。以百度输入框为例,表达式为:

    /html/body/div[1]/div[2]/div[5]/div[1]/div/form/span[1]

  • 相对路径:从任意节点开始,根据节点描述信息找到需要的节点。同样以百度输入框为例,表达式为:

    //input[@id='su']

对比两种表达式,可以发现:

  • 相对路径更简洁,方便阅读
  • 相对路径更稳定,当前端页面有结构变动就容易引起绝对路径发生变化

因此,在项目中几乎都是使用相对路径进行定位

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则返回该节点
谓语格式:

复制代码
<span style="background-color:#2d2d2d"><span style="color:#cccccc"><code class="language-javascript">节点名称<span style="color:#cccccc">[</span>谓语<span style="color:#cccccc">]</span>
</code></span></span>
常用谓语 说明 示例 示例说明
n 节点编号 //div[2] 选择所有<div>节点且该节点是其父级的第二个<div>节点
last() 最后一个节点 //div[last()] 选择所有<div>节点且该节点是其父级的最后一个子节点
position() 比较节点编号 //div[position() < 3] 选择所有<div>节点且该节点是其父级的前两个<div>节点
@属性 属性 //input[@id] 选择所有<input>节点且该节点带id属性
@属性='属性值' 比较属性 //input[@id='kw'] 选择所有<input>节点且该节点id属性为'kw'
text() 比较节点文本 //a[text()='新闻'] 选择所有<a>节点且该节点文本为'新闻'
谓语运算符 说明 示例 示例说明
= != > < >= <= 大小比较 /html/body/div[position()=2] 选择<body>中的第2个<div>子节点
+ - *、 div mod 加减乘除求余 /html/body/div[last()-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')] 选择所有文本以'新闻'开头的节点

备注:

  1. last()、position()、text()、not()这类带有括号的表达式,实质都是xpath提供的函数,本篇文章只列出了常用函数
  2. 根据W3C标准,第一个节点编号应该是[1],但在IE5及更高版本中第一个节点编号是[0]

xpath轴(axis)

轴:表示所选节点与当前节点之间的树关系,用来筛选对于当前节点有相同关系的一类节点
轴格式:

复制代码
<span style="background-color:#2d2d2d"><span style="color:#cccccc"><code class="language-javascript">当前节点<span style="color:#67cdcc">/</span>轴名称<span style="color:#67cdcc">:</span><span style="color:#67cdcc">:</span>节点名称
</code></span></span>
说明 示例 示例说明
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 当前节点

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关推荐
gnip7 分钟前
包管理工具的发展
前端
码农小灰10 分钟前
Kafka消息持久化机制全解析:存储原理与实战场景
java·分布式·kafka
前端工作日常1 小时前
H5 实时摄像头 + 麦克风:完整可运行 Demo 与深度拆解
前端·javascript
韩沛晓1 小时前
uniapp跨域怎么解决
前端·javascript·uni-app
前端工作日常1 小时前
以 Vue 项目为例串联eslint整个流程
前端·eslint
程序员鱼皮1 小时前
太香了!我连夜给项目加上了这套 Java 监控系统
java·前端·程序员
该用户已不存在2 小时前
这几款Rust工具,开发体验直线上升
前端·后端·rust
前端雾辰2 小时前
Uniapp APP 端实现 TCP Socket 通信(ZPL 打印实战)
前端
集成显卡2 小时前
使用 Google 开源 AI 工具 LangExtract 进行结构化信息抽取
python·google·openai
无羡仙2 小时前
虚拟列表:怎么显示大量数据不卡
前端·react.js