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 节点编号 //div2 选择所有<div>节点且该节点是其父级的第二个<div>节点
last() 最后一个节点 //divlast() 选择所有<div>节点且该节点是其父级的最后一个子节点
position() 比较节点编号 //divposition() \< 3 选择所有<div>节点且该节点是其父级的前两个<div>节点
@属性 属性 //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') 选择所有文本以'新闻'开头的节点

备注:

  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 当前节点

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

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

相关推荐
微尘寒风11 小时前
【Git】的安装和使用
java·git
东风破_11 小时前
danci 项目(三):从 JSON 数据到 AI Coding,真实项目里的数据清洗、Prompt 和工程规范
前端·后端·node.js
y = xⁿ11 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习
东风破_12 小时前
danci 项目(一):从需求到架构,一个单词学习系统为什么会这样设计
前端·后端·node.js
蒲公英eric12 小时前
从客户端到服务端:DVWA DOM 型 XSS 模块完整漏洞分析教程
前端·web安全·ai·xss·dvwa·ai安全
侧耳倾听11112 小时前
jwt使用简介
java·jwt
单线程_0112 小时前
从案例分析 Vue3 Tokenizer+Parser 源码三
前端·javascript·vue.js
顶点多余12 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
AI人工智能+电脑小能手13 小时前
大白话说Java设计模式-46-责任链模式(业务实战篇)
java·设计模式·责任链模式·风控校验·servlet filter·spring interceptor·链式处理
Setsuna_F_Seiei13 小时前
前端转型 Agent 开发 03 之 Agent Tools - 给 Agent 装上手脚
前端·agent·ai编程