appium中xpath定位原生元素详解

当页面元素中没有包含明显的text、ID等或者text不具备唯一性时,定位就比较坑爹了,那么我们就必须要使用xpath定位了。
一般情况下不推荐使用绝对路径,如果确实人品爆棚整个页面都没有你能够定位到的东西或者无法定位时那就老老实实一层一层的写,但这种情况基本不会存在。
下面主要看下相对路劲的定位方法:
一、用ID定位
如图:
appium中xpath定位原生元素详解
文章图片


上面的"账单"和"我要"的id都是com.wlqq:id/title_left_btn,并且假设当前页面只有这两个位置id为前面写的,那么你在用id定位"账单"的时候,就可以用xpath了,因为id已经不唯一了。用id定位“账单”的为:xpath=(//android.widget.TextView[@resource-id="com.wlqq:id/title_left_btn"])[1],定位"我要"的为:
xpath=(//android.widget.TextView[@resource-id="com.wlqq:id/title_left_btn"])[2]
此处注意三点:
a,下标是从1开始,而不是0;
b,如果有下标,需要用括号把前面的部分括起来,并且前面需要加xpath=,可能有些人习惯了前面都加xpath=,但是像我这种只习惯写//开头,不写xpath=的就被坑惨了。。。反正不容易发现是因为没有写xpath=,也可能是我个人比较坑吧。
c,就是和web不一样的就是标签的取值,在这里取的是class的值=android.widget.TextView而不是看到的标签TextView,具体原因没有深究。反正记住用class代替标签就对了。

另外,上面的只是为了说明只有1个层级的时候xpath的用法,1层也算是一种相对路径吧。因为没有从第一个位置的属性开始写。xpath的书写规则基本是越少越好。所以层级也是越少越好。有1层可以唯一定位就不要2层。
二、没有ID可定位,利用父子、兄弟关系来定位
xpath常用轴函数:
1、preceding-sibling::----可以找到节点前面也就是哥哥节点
2、following-sibling::----可以找到节点后面也就是弟弟节点
3、parent::----可以找到节点的父亲节点
4、..----也是可以找到父亲接到,常常替代parent::
如图:
appium中xpath定位原生元素详解
文章图片


要定位到上面的小人图标:
//android.widget.TextView[contains(@text, "钱包")]/following-sibling::android.widget.LinearLayout/android.widget.ImageButton
因为是紧挨着的,所以弟弟没有下标,可想而知如果是第几个弟弟,就加个下标吧。哥哥也是同理

绕个圈说下父子关系:
//android.widget.TextView[contains(@text, "钱包")]/../android.widget.LinearLayout[2]/android.widget.ImageButton







【appium中xpath定位原生元素详解】

    推荐阅读