记录两种好用常用的xpath定位方式
目录
总结概览
写法一:xpath=//text()[.='选择网元类型']/parent::*
逐步分解:
完整解释:
适用场景与特点:
写法二:xpath=(//plx-select[.//text()='选择指标']//div)[2]
逐步分解:
完整解释:
适用场景与特点:
对比总结
总结概览
这两种写法代表了两种不同的XPath定位策略:
-
第一种:基于精确的文本内容定位,然后向上查找父元素。精确、直接。
-
第二种:基于相对模糊的文本内容定位到一个复杂组件,然后通过层级关系定位到其内部的下拉箭头。灵活、实用。
xpath=//text()[.='选择网元类型']/parent::*
xpath=(//plx-select[.//text()='选择指标']//div)[2]
写法一:xpath=//text()[.='选择网元类型']/parent::*
这是一种非常精确的定位方法。
逐步分解:
-
//text()
:-
在HTML DOM中,
text()
是一个节点类型,代表元素的文本内容。 -
//text()
表示在整个HTML文档中,查找任意层级下的所有文本节点。
-
-
[.='选择网元类型']
:-
这是一个谓词过滤器(Predicate)。
[ ]
里的条件用于筛选节点。 -
.
代表当前节点,即上一步找到的每一个文本节点。 -
这个条件的意思是:文本节点的内容必须完全等于“选择网元类型”。
-
-
/parent::*
:-
/
表示从当前节点集(即内容为“选择网元类型”的文本节点)向下一步。 -
parent::
是轴(Axis),表示选择当前节点的父节点。 -
*
是一个节点测试(Node Test),表示匹配任何元素节点(即HTML标签,如<div>
,<span>
,<button>
等)。
-
完整解释:
在整个文档中,找到内容完全等于“选择网元类型”的文本节点,然后获取它的直接父元素。
适用场景与特点:
-
精确性:通过唯一的文本内容来定位,非常可靠。
-
目标明确:你想要点击或操作的,正是包含这个特定文字的那个元素(比如一个按钮、一个下拉框的标签、一个标题等)。
-
依赖文本:如果网页文字发生变更(例如从“选择网元类型”改为“请选择网元”),此XPath将立即失效。
-
结构假设:它假设你需要的操作目标就是文本的直接父元素。如果文本在一个复杂的嵌套结构中(例如
<span><i>选择网元类型</i></span>
),那么父元素可能是<i>
而不是外层的<span>
或<button>
,这时可能需要使用parent::div
或ancestor::button
来更精确地定位。
写法二:xpath=(//plx-select[.//text()='选择指标']//div)[2]
这是一种更复杂、更实用的定位方法,常用于操作现代Web框架(如Vue, Angular, React)生成的UI组件。
逐步分解:
-
//plx-select
:-
查找文档中任意层级的
<plx-select>
元素。这很可能是一个自定义的Web组件(例如来自某个UI库,如Element UI, Ant Design等,它们通常会生成特定的标签名)。
-
-
[.//text()='选择指标']
:-
这也是一个谓词过滤器,用于筛选上一步找到的
<plx-select>
组件。 -
.//text()
中的.
代表当前节点(即每个<plx-select>
组件)。所以.//text()
的意思是:在当前<plx-select>
组件的所有后代节点中查找文本节点。 -
条件
='选择指标'
表示在这些后代文本节点中,至少有一个包含“选择指标”这个文字。 -
这个条件的目的是:找到那个标签文字是“选择指标”的下拉框组件。
-
-
//div
:-
在上一步筛选出的特定
<plx-select>
组件内部,继续查找任意后代节点中的<div>
元素。一个复杂的下拉框组件内部通常包含很多个<div>
。
-
-
(......)[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组件。而第一种写法则更通用,适用于定位任何包含已知文本的元素。