高级定位技巧 xpath定位
高阶定位技巧 - Xpath
简介
XPath 是一种用于在 XML 文档中定位和选择节点的语言。它可以通过使用路径表达式来指定节点的位置,并支持使用各种条件进行过滤和匹配。
以下是一些常见的 XPath 高阶定位方法:
-
使用逻辑运算符,如 and、or、not,将多个条件组合起来进行定位。
-
使用轴定位,通过预定义的轴(如子节点、父节点、兄弟节点等)来获取相对于当前节点的其他节点集合。
Xpath 高级定位技巧
包含
contains()
是 Xpath
表达式中的一个函数。contains 会匹配符合某属性中包含 xx 字符串的元素。例如//*[contains(@text,"hogwarts")]
则会匹配text
属性的属性值中包含hogwarts
的元素
contains()
函数的使用格式://*[contains(@属性,"属性值")]
注意:
contains()
函数定位到的元素很可能是多个。contains()
函数内的属性名需要用@
开始。
-
示例
-
打开雪球 apk,在搜索框中输入
阿里
,界面如下:
- 打开并连接元素定位工具,示例使用的工具
Appium Inspector
,点击如下图所示的搜索图标。
- 定位策略选择
XPATH
,定位当前界面中text
属性包含阿里
的元素。
//*[contains(@text,"阿里")]
- 点击查找后,呈现共有 12 个元素符合
text
属性中包含阿里
,同时也符合之前提到的定位的元素很容易有多个这一特点。
XPath 轴定位
XPath 轴是 XPath 语言中的一个重要概念,它可以根据节点之间的关系来选择节点。XPath 轴定义了节点的一个集合,这个集合由满足特定条件的节点组成。
在轴定位中,可以通过一个节点,定位到当前的节点的兄弟节点、父节点、祖先节点等等。
父子关系 - 当前节点的父节点
- 定位到当前节点的父节点,格式如下:
/当前节点/..
/当前节点/parent::*
- 示例:定位
text
属性为阿里巴巴的元素的父节点
- 定位
text
属性为阿里巴巴的元素。
//*[@text="阿里巴巴"]
- 再定位父节点,两个表达式都可以。
//*[@text="阿里巴巴"]/..
//*[@text="阿里巴巴"]/parent::*
父子关系 - 当前节点的子节点
- 定位到当前节点的子节点,格式如下:
/当前节点/child::*
/当前节点/*
-
示例:定位
resource-id
属性为com.xueqiu.android:id/stock_layout
的元素的子节点 -
搜索
阿里巴巴
后,进入下面的页面,定位下图的元素。
- 使用 resource-id 定位当前节点。
//*[@resource-id="com.xueqiu.android:id/stock_layout"]
- 再定位当前节点的子节点,最终找到多个节点。
//*[@resource-id="com.xueqiu.android:id/stock_layout"]/child::*
祖孙关系 - 当前节点的爷节点
从当前节点定位到父级节点的的父级节点,使用示例如下:
/当前节点/../..
/当前节点/parent::*/parent::*
-
示例:定位
resource-id
属性为com.xueqiu.android:id/stockName
的元素的爷节点 -
定位当前元素的爷节点
- 爷节点的定位如图
- 先定位到当前节点,再寻找两层的父节点。
//*[@resource-id="com.xueqiu.android:id/stockName"]/../..
祖孙关系 - 当前节点的孙节点
从当前节点定位到子节点的子节点,使用示例为:
/当前节点/child::*/child::*
/当前节点/*/*
-
示例:定位
resource-id
属性为com.xueqiu.android:id/stock_layout
的元素的孙节点 -
定位当前节点的孙子节点
- 先定位到当前节点,在定位两层的儿子节点,即可定位到孙子节点。
//*[@resource-id="com.xueqiu.android:id/stock_layout"]
祖孙关系 - 当前节点的祖先节点
- 返回当前节点的所有祖先节点,使用示例为
/当前节点/ancestor::*
- 示例:定位
text
属性为HK
的元素的 class 属性为某个值的所有祖先节点
//*[@text="HK"]/ancestor::android.widget.LinearLayout
//*[@text="HK"]/ancestor::android.widget.RelativeLayout
示例中表示是找到元素包含文本 HK
并且它的所有祖先元素中属性 class
为 android.widget.LinearLayout
和 android.widget.RelativeLayout
的节点,其中这两个属性值分别是常用的线性布局类和相对布局类
- 显式指定要返回的祖先节点,使用方式为:
//*[@text="HK"]/ancestor::android.widget.RelativeLayout[1]
定位的顺序为:
- 定位当前节点线性布局的祖先节点
//*[@text="HK"]/ancestor::android.widget.LinearLayout
- 一共定位到了 9 个祖先
- 下一步定位这些祖先节点中距离当前节点最近的祖先节点,同时也是当前节点的父节点。
- 只需要在定位所有祖先的表达时候添加
[1]
即可。
//*[@text="HK"]/ancestor::android.widget.LinearLayout[1]
注意: 这里的[1]
并不是数组下标的意思,可以理解为,从当前定位的元素向前数一代,也可以理解为向外一层。
兄弟关系 - 当前节点的兄弟节点
- 定位当前节点后的所有兄弟节点
/当前节点/following-sibling::*
- 定位当前节点后的兄弟节点中的某一个节点,在定位所有兄弟节点后添加条件。
//*[@resource-id="com.xueqiu.android:id/stock_layout"]/following-sibling::*[@resource-id="com.xueqiu.android:id/price_layout"]
定位顺序为:
- 定当前节点后的所有兄弟节点
- 使用 XPath 定位,定位到的两个元素就是上图中的两个兄弟。
//*[@resource-id="com.xueqiu.android:id/stock_layout"]/following-sibling::*
- 当元素只有一个兄弟节点时,如果需要定位这些兄弟节点中的某一个,则需要再增加一个条件,在这些兄弟节点中定位到
resource-id
是com.xueqiu.android:id/price_layout
的节点。
//*[@resource-id="com.xueqiu.android:id/stock_layout"]/following-sibling::*[@resource-id="com.xueqiu.android:id/price_layout"]
- 定位当前节点前的所有兄弟节点
/当前节点/preceding-sibling::*
- 节点前有多个兄弟节点
//*[@resource-id="com.xueqiu.android:id/add_attention"]/preceding-sibling::*[@resource-id="com.xueqiu.android:id/price_layout"]
- 定位当前节点前的所有兄弟节点
- 使用 Xpath 定位,表达式如下
//*[@resource-id="com.xueqiu.android:id/add_attention"]/preceding-sibling::*
- 如果定位到的元素为单个时,可直接使用,如果定位到的兄弟节点有多个,定位到某一个兄弟节点同样需要增加过滤条件。例如,需要定位到兄弟节点中,
resource-id
为com.xueqiu.android:id/stock_layout
的元素。
//*[@resource-id="com.xueqiu.android:id/add_attention"]/preceding-sibling::*[@resource-id="com.xueqiu.android:id/stock_layout"]
XPath 运算符
AND
AND 表示可以在 XPath
表达式中同时具备 2 个条件,在 AND
两个条件都应该为真的情况下,即该元素既有 条件A
又有 条件B
。AND 定位取到的是交集。
- 示例:定位如下图页面中的红框所框出来的元素。
- 使用 resource-id 进行定位时,会定位到多个元素
- 使用
and
运算符增加筛选条件进行过滤,需要满足符合 resource-id,且文本内容为阿里巴巴
的元素。只有两个条件都符合时才会被选中
//*[@resource-id="com.xueqiu.android:id/stockName" and @text="阿里巴巴"]
OR
OR 表示可以在 XPath
表达式中放置 2 个条件,在 OR
的情况下,两个条件中的任何一个为真,就可定位到该元素。OR
定位获取的是并集。
- 示例:定位当前页面中
resource-id
为com.xueqiu.android:id/stockName
或文本内容text
为加自选的元素
,也就是下面 6 个元素:
//*[@resource-id="com.xueqiu.android:id/stock_layout" or @text="加自选"]
- 定位结果如图所示:
总结
- 包含
- XPath 轴定位
- XPath 运算符