掌握高阶定位技巧:Xpath 神功解析!
更多软件测试学习资料戳
简介
XPath 是一种用于在 XML 文档中定位和选择节点的语言。它可以通过使用路径表达式来指定节点的位置,并支持使用各种条件进行过滤和匹配。以下是一些常见的 XPath 高阶定位方法:
使用逻辑运算符,如 and、or、not,将多个条件组合起来进行定位。
使用轴定位,通过预定义的轴(如子节点、父节点、兄弟节点等)来获取相对于当前节点的其他节点集合。
使用谓词,查找特定节点或包含特定值的节点,谓词嵌入方括号中。
使用内置函数,执行一些复杂的操作,如字符串处理、数值计算等。
Xpath 高级定位技巧
包含-contains()
Xpath 表达式中的一个函数,contains 会匹配符合某属性中包含 xx 字符串的元素。例如//*[contains(@text,"hogwarts")]则会匹配 text 属性的属性值中包含 hogwarts 的元素
contains()函数的使用格式
特点 contains() 函数定位的元素很容易为 listcontains() 函数内的属性名需要用 @ 开始
示例
打开雪球 apk,在搜索框中输入阿里,界面如下:
![](https://static001.geekbang.org/infoq/db/db19675f6fa45c4a31426be18caf78c5.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
打开并连接元素定位工具,示例使用的工具 Appium Inspector,点击如下图所示的搜索图标。
![](https://static001.geekbang.org/infoq/7c/7c438c920a0819fa20deea18b009be00.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
定位策略选择 XPATH,定位当前界面中 text 属性包含阿里的元素。
![](https://static001.geekbang.org/infoq/a9/a9def4a8e9a528d7cfa4448306364d61.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
点击查找后,呈现共有 12 个元素符合 text 属性中包含阿里,同时也符合之前提到的定位的元素很容易有多个这一特点。
![](https://static001.geekbang.org/infoq/c2/c26cc3d76d4e5e91ff5ee42ac552916c.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
XPath 轴
XPath 轴是 XPath 语言中的一个重要概念,它可以根据节点之间的关系来选择节点。XPath 轴定义了节点的一个集合,这个集合由满足特定条件的节点组成。
可以通过过定位一个节点,定位到当前的节点的兄弟节点、父节点、爷爷节点、祖先节点等等。
![](https://static001.geekbang.org/infoq/d1/d1649af1c6d6d9c554191e4f4fa18e0b.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
父子-当前节点的父节点
定位到当前节点的父节点,格式如下:
示例:定位 text 属性为阿里巴巴的元素的父节点
![](https://static001.geekbang.org/infoq/be/be70da348a42a892dee739293f53c9e2.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
定位 text 属性为阿里巴巴的元素。
![](https://static001.geekbang.org/infoq/34/34999863cba5010df0bddef96339ef5b.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
再定位父节点,两个表达式都可以。
![](https://static001.geekbang.org/infoq/4f/4f05764d596532278d6afbb907567e3c.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
父子节点
从当前节点定位到它的子节点,使用示例如下:
定位的顺序为:
搜索阿里巴巴后,进入下面的页面,定位下图的元素。
![](https://static001.geekbang.org/infoq/16/1607b30117fc53dbfd4b06803058bd6d.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
使用 resource-id 定位当前节点
![](https://static001.geekbang.org/infoq/be/bed8b3c3cf26ad180e781307396cacfb.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
再定位当前节点的子节点,定位到两个节点
![](https://static001.geekbang.org/infoq/4c/4c57de19324982c08679d7aa6f045233.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
爷孙节点
从当前节点定位到父级节点的的父级节点,使用示例如下:
定位顺序为:
定位当前元素的爷节点
![](https://static001.geekbang.org/infoq/78/780a5b7db4646236efcd80b7822632b0.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
爷节点的定位如图
![](https://static001.geekbang.org/infoq/0d/0d1337d6bd90932f678658e72b089b3c.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
先定位到当前节点,再寻找两层的父节点。
![](https://static001.geekbang.org/infoq/c1/c1275190af427726b5aa9ebebdd2d505.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
爷孙节点
从当前节点定位到子节点的子节点,使用示例为:
定位顺序为:
定位当前节点的孙子节点
![](https://static001.geekbang.org/infoq/26/26a871c337a229e4a9aefe90b6eeb4b8.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
先定位到当前节点,在定位两层的儿子节点,即可定位到孙子节点。
![](https://static001.geekbang.org/infoq/ae/ae6df035f710f94fd0e4f1f4e29b8536.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
祖先节点 - ANCESTOR
返回当前节点的所有祖先节点
示例表示是找到元素包含文本 HK 并且它的所有祖先元素中属性 class 为 android.widget.LinearLayout 和 android.widget.RelativeLayout 的节点,其中这两个属性值分别是常用的线性布局类和相对布局类,使用方式如下:
显式指定要返回的祖先节点,使用方式为:
定位的顺序为:
定位当前节点线性布局的祖先节点
![](https://static001.geekbang.org/infoq/6f/6fd22fa6f221ecb21f89dfccd9a4d648.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
一共定位到了 9 个祖先
![](https://static001.geekbang.org/infoq/7c/7cc846d75ee53607ca8551d8028eb621.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
下一步定位这些祖先节点中距离当前节点最近的祖先节点,同时也是当前节点的父节点。
![](https://static001.geekbang.org/infoq/7d/7dca395021d2d9061e5477d4461da36f.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
只需要在定位所有祖先的表达时候添加[1]即可。
![](https://static001.geekbang.org/infoq/6f/6fc446fc5274e9fbd511d5ded4ef78ce.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
注意: 这里的[1]并不是数组下标的意思,可以理解为,从当前定位的元素向前数一代,也可以理解为向外一层。
兄弟姐妹节点
从当前节点定位到后面的兄弟姐妹节点
定位当前节点后的所有兄弟节点
定位当前节点后的兄弟节点中的某一个节点,在定位所有兄弟节点后添加条件。
定位顺序为:
定当前节点后的所有兄弟节点
![](https://static001.geekbang.org/infoq/5c/5ce0053c77ed06d0fb880794ee072c9c.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
使用 XPath 定位,定位到的两个元素就是上图中的两个兄弟。
![](https://static001.geekbang.org/infoq/05/05e84ba4fad72b6d864783ac9a871d93.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
当元素只有一个兄弟节点时,如果需要定位这些兄弟节点中的某一个,则需要再增加一个条件,在这些兄弟节点中定位到 resour-id 是 com.xueqiu.android:id/price_layout 的节点。
![](https://static001.geekbang.org/infoq/ef/efde523749b117c57d77ad072da368b6.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
从当前节点定位到它前面的兄弟姐妹节点
定位当前节点前的所有兄弟节点
节点前有多个兄弟节点
示例
定位当前节点后的所有兄弟节点
![](https://static001.geekbang.org/infoq/c1/c1458fdacdc8f95e7740dcf5b72d2782.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
使用 Xpath 定位,表达式如下
![](https://static001.geekbang.org/infoq/de/de247efd79961a279f4361d28db78ebd.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
如果定位到的元素为单个时,可直接使用,如果定位到的兄弟节点有多个,定位到某一个兄弟节点同样需要增加过滤条件。例如,需要定位到兄弟节点中,resource-id 为 com.xueqiu.android:id/stock_layout 的元素。
![](https://static001.geekbang.org/infoq/d2/d2db251a7a36252497dd6ee40e6db806.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
XPath 运算符
AND
AND 表示可以在 XPath 表达式中同时具备 2 个条件,在 AND 两个条件都应该为真的情况下,即该元素既有 条件 A 又有 条件 B 。AND 定位取到的是交集。
示例:定位如下图页面中的红框所框出来的元素。
![](https://static001.geekbang.org/infoq/98/98309f12c33502e7349f494452ec22ad.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
使用 resource-id 进行定位时,会定位到多个元素
![](https://static001.geekbang.org/infoq/95/959fcaa664d98f1b9c7e3dc1e8c1a907.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
使用 and 运算符增加筛选条件进行过滤,需要满足符合 resource-id,且文本内容为阿里巴巴的元素。只有两个条件都符合时才会被选中
![](https://static001.geekbang.org/infoq/1f/1fb40f1d524995f05028ddb1ce656c83.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
OR
OR 表示可以在 XPath 表达式中放置 2 个条件,在 OR 的情况下,两个条件中的任何一个为真,就可定位到该元素。OR 定位获取的是并集。
示例:定位当前页面中 resource-id 为 com.xueqiu.android:id/stockName 或文本内容 text 为加自选的元素,也就是下面 6 个元素:
![](https://static001.geekbang.org/infoq/f5/f55f6bacd526272b96d91896d654413e.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
定位结果如图所示:
![](https://static001.geekbang.org/infoq/46/461e8a5c1d21ec4259c62f15822da563.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
总结
包含
XPath 轴定位
XPath 运算符
![](https://static001.geekbang.org/infoq/27/277c2b42a0682231c4f9eda0e4d0e3c0.png)
评论