appium中xpath定位原生元素詳解
當頁面元素中沒有包含明顯的text、ID等或者text不具備唯一性時,定位就比較坑爹了,那麼我們就必須要使用xpath定位了。
一般情況下不推薦使用絕對路徑,如果確實人品爆棚整個頁面都沒有你能夠定位到的東西或者無法定位時那就老老實實一層一層的寫,但這種情況基本不會存在。
下面主要看下相對路勁的定位方法:
一、用ID定位
如圖:
上面的"賬單"和"我要"的id都是com.wlqq:id/title_left_btn,並且假設當前頁面只有這兩個位置id為前面寫的,那麼你在用id定位"賬單"的時候,就可以用xpath了,因為id已經不唯一了。用id定位“賬單”的為:xpath=(//android.widget.TextView[
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::
如圖:
要定位到上面的小人圖示:
//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