记录两种好用常用的xpath定位方式

目录

总结概览

写法一:xpath=//text()[.='选择网元类型']/parent::*

逐步分解:

完整解释:

适用场景与特点:

写法二:xpath=(//plx-select[.//text()='选择指标']//div)[2]

逐步分解:

完整解释:

适用场景与特点:

对比总结


总结概览

这两种写法代表了两种不同的XPath定位策略:

  • 第一种 :基于精确的文本内容定位,然后向上查找父元素。精确、直接

  • 第二种 :基于相对模糊的文本内容定位到一个复杂组件,然后通过层级关系定位到其内部的下拉箭头。灵活、实用

xpath=//text()[.='选择网元类型']/parent::*

xpath=(//plx-select[.//text()='选择指标']//div)[2]

写法一:xpath=//text()[.='选择网元类型']/parent::*

这是一种非常精确的定位方法。

逐步分解:
  1. //text()

    • 在HTML DOM中,text() 是一个节点类型,代表元素的文本内容。

    • //text() 表示在整个HTML文档中,查找任意层级下的所有文本节点。

  2. [.='选择网元类型']

    • 这是一个谓词过滤器(Predicate)。[ ] 里的条件用于筛选节点。

    • . 代表当前节点,即上一步找到的每一个文本节点。

    • 这个条件的意思是:文本节点的内容必须完全等于"选择网元类型"

  3. /parent::*

    • / 表示从当前节点集(即内容为"选择网元类型"的文本节点)向下一步。

    • parent:: 是轴(Axis),表示选择当前节点的父节点

    • * 是一个节点测试(Node Test),表示匹配任何元素节点(即HTML标签,如<div>, <span>, <button>等)。

完整解释:

在整个文档中,找到内容完全等于"选择网元类型"的文本节点,然后获取它的直接父元素。

适用场景与特点:
  • 精确性:通过唯一的文本内容来定位,非常可靠。

  • 目标明确:你想要点击或操作的,正是包含这个特定文字的那个元素(比如一个按钮、一个下拉框的标签、一个标题等)。

  • 依赖文本:如果网页文字发生变更(例如从"选择网元类型"改为"请选择网元"),此XPath将立即失效。

  • 结构假设 :它假设你需要的操作目标就是文本的直接父元素。如果文本在一个复杂的嵌套结构中(例如<span><i>选择网元类型</i></span>),那么父元素可能是<i>而不是外层的<span><button>,这时可能需要使用 parent::divancestor::button 来更精确地定位。

写法二:xpath=(//plx-select[.//text()='选择指标']//div)[2]

这是一种更复杂、更实用的定位方法,常用于操作现代Web框架(如Vue, Angular, React)生成的UI组件。

逐步分解:
  1. //plx-select

    • 查找文档中任意层级的 <plx-select> 元素。这很可能是一个自定义的Web组件(例如来自某个UI库,如Element UI, Ant Design等,它们通常会生成特定的标签名)。
  2. [.//text()='选择指标']

    • 这也是一个谓词过滤器,用于筛选上一步找到的 <plx-select> 组件。

    • .//text() 中的 . 代表当前节点 (即每个 <plx-select> 组件)。所以 .//text() 的意思是:在当前 <plx-select> 组件的所有后代节点中查找文本节点。

    • 条件 ='选择指标' 表示在这些后代文本节点中,至少有一个包含"选择指标"这个文字。

    • 这个条件的目的是:找到那个标签文字是"选择指标"的下拉框组件。

  3. //div

    • 上一步筛选出的特定 <plx-select> 组件内部 ,继续查找任意后代节点中的 <div> 元素。一个复杂的下拉框组件内部通常包含很多个 <div>
  4. (......)[2]

    • 括号 () 将前面的整个路径 //plx-select[.//text()='选择指标']//div 包裹起来,先计算出所有匹配的 <div> 元素的集合。

    • [2] 表示从这个结果集中选取第二个 匹配的 <div> 元素。

完整解释:

首先定位到标签为"选择指标"的那个自定义下拉框组件,然后在这个组件内部找到所有的 <div> 元素,并从中选择第二个。

适用场景与特点:
  • 组件化开发:专门用于定位由现代前端框架构建的复杂UI组件。

  • 操作特定部分 :这种写法通常用于定位下拉框的箭头图标下拉区域 。因为第一个 <div> 可能是整个组件的容器,第二个 <div> 可能就是那个可点击的下拉箭头。

  • 相对稳定 :通过组件的标签名 (plx-select) 和标签文本来定位,比单纯依赖CSS类名或动态ID更稳定。

  • 索引依赖[2] 是一个脆弱点 。如果组件的HTML结构发生变化(比如在开头插入了一个新的 <div>),那么原本的目标元素就可能变成 [3],导致定位失败。这是一种"通过位置定位"的方法。

  • 文本模糊匹配 :原写法是精确匹配,可以改为模糊匹配以增强鲁棒性,例如://plx-select[contains(.//text(), '选择指标')]//div[2]

对比总结

特性 写法一://text()[.='选择网元类型']/parent::* 写法二:(//plx-select[.//text()='选择指标']//div)[2]
策略 文本驱动:直接通过可见文本定位其父容器。 组件驱动:先定位组件,再定位组件内部的特定子元素。
精确度 非常高,直接定位到文本的父元素。 相对较低,依赖于组件内部结构的稳定性(特别是索引[2])。
灵活性 较弱,严格依赖文本内容和直接的父子关系。 较强,能处理复杂的嵌套组件。
典型用途 定位按钮、链接、标题等文本明确的简单元素。 定位复杂UI组件(如下拉框、日期选择器)的特定交互部分(如箭头、输入框)。
脆弱点 文本内容改变。 组件内部HTML结构改变(特别是索引位置)。

在实际的自动化测试(如Selenium)中,第二种写法非常常见,因为测试对象大多是这种复杂的UI组件。而第一种写法则更通用,适用于定位任何包含已知文本的元素。

相关推荐
zhz52144 小时前
ArcGIS Pro 进程管理:自动化解决方案与最佳实践
运维·python·arcgis·自动化
猫头虎8 小时前
AI_NovelGenerator:自动化长篇小说AI生成工具
运维·人工智能·python·自动化·aigc·gpu算力·ai-native
zmjjdank1ng8 小时前
什么是Ansible 清单
服务器·自动化·ansible
测试老哥21 小时前
如何编写好测试用例?
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
AALoveTouch21 小时前
大麦网抢票:基于Wireshark协议分析
网络·测试工具·wireshark
weixin_4569042721 小时前
工业自动化通信控制
运维·struts·自动化
b***25111 天前
比斯特自动化|为什么焊接18650电池离不开点焊机?
运维·自动化
kunge1v51 天前
学习爬虫第五天:自动化爬虫
爬虫·python·自动化
m***记1 天前
Python 自动化办公的 10 大脚本
windows·python·自动化