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

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

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

相关推荐
IT_陈寒19 小时前
深入理解Java:核心原理与最佳实践
前端·人工智能·后端
钱多多_qdd19 小时前
基于mac环境,升级python环境问题解决
开发语言·python·macos
恋猫de小郭19 小时前
Android Studio 放着没怎么用,怎么也会越来越卡?
android·前端·flutter
boonya19 小时前
Python 量化金融框架及技术落地方案
开发语言·python·金融
梦想不只是梦与想19 小时前
rag和agent的区别
人工智能·python·知识库·rag·智能体·agent‌
go不是csgo19 小时前
从一个 while 循环开始,搭一个完整的 AI Agent(参考开源项目 learn claude code)
人工智能·python·ai
fanzhonghong19 小时前
javaWeb开发之前端实战(Vue工程化+ElementPlus)
前端·javascript·vue.js·后端·spring
WL_Aurora19 小时前
Python爬虫实战(一):图书网站API接口爬取
爬虫·python
沙振宇19 小时前
【Python】使用YOLO8识别视频中的车与人物
python·yolo·音视频·状态模式·识别
Ulyanov19 小时前
《从质点到位姿:基于Python与PyVista的导弹制导控制全栈仿真》: 基石——3-DOF质点弹道的高保真建模与数值稳定性分析
开发语言·python·算法·ui·系统仿真