一、定位工具
在安裝appium環境的時候我們已經安裝了SDK,里面就自帶有元素定位的工具,位置在.../sdk/tools/uiautomatorviewer.bat,由于安裝路徑各有不同,如果實在找不到可以具體路徑,可以在電腦中查找uiautomatorviewer.bat文件,找到后雙擊打開即可,初始界面如下:
打開工具后,將手機連接電腦,這里要提醒的是,該工具只能獲取手機當前的界面截圖,而無法實時同步的顯示手機界面,工具上有兩個按鈕:第一個圖標是獲取設備截屏,可以獲取元素完整的層級關系
第二個圖標是獲取壓縮后的設備截屏,包含各個元素的屬性,無法獲得完整的層級路徑
所以我們一般使用第一個獲取設備截屏的按鈕就行,連接好手機后點擊第一個按鈕得到當前手機界面,可以通過鼠標定位界面上的各個元素,右側可查看該元素的相關值
ps:有一點要特別提醒,由于在自動化運行過程中一定要運行Appium,但我在使用中發現uiautomatorviewer在獲取設備截圖時好像與Appium有沖突,經常會報錯:Error obtaining UI hierarchy。如果是在腳本調試階段,可以停止運行Appium即可,調試完成后再開啟Appium跑腳本
二、定位方法
1、ID定位(取resource-id、id、name)
當定位到元素后,在node detail中有該元素的所有參數,如果有resource-id屬性就取resource-id值,有id屬性就取id值,有name屬性就取name值
但是在取resource-id、id、name值時這些值一定要唯一,可以唯一定位到該元素才行,如果值是一個通用值,那么無法區別出元素仍然無法定位,這時就要換其他定位方法
2、class、text定位(取class、text)
class是一個類屬性,一般重復性會很高,所以很少直接使用,這里講class屬性是由于在xpath中會頻繁用到class屬性
text屬性是文本,如果是要定位到唯一的標題之類的可以直接使用text屬性
3、xpath定位
通過上面兩種方法可知,如果有id屬性當然就直接使用id值,但如果沒有就干脆使用xpath,理論上xpath可以定位到所有元素
xpath的寫法是根據層級的class屬性一級一級定位到元素
絕對路徑:
元素的全路徑,包含了全部節點。這種方法首先一看就覺得太長寫起來好累,如果層級再多那寫起來簡直無休無止了;另一方面由于涉及到太多層,一旦中間任何一層有變動,那元素就定位不到了,例如:
//android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.view.ViewGroup/android.widget.ImageButton
相對路徑:
1.如果當前class內存在唯一text可以定位元素,直接用當前class+text,例如://android.widget.TextView[@text='日常巡查']
2.如果當前class內存在唯一content-desc可以定位元素,直接用當前class+content-desc,例如://android.widget.TextView[@content-desc='巡場排查']
3.如果當前class內,resource-id、text、content-desc三者取其二或者取其三能唯一定位元素,直接用當前class+兩者/三者并列,例如://android.widget.TextView[@resource-id='com.space.grid.debug:id/text' and?@text='數據采集']
4.如果當前class內,text、content-desc中的文本內容不是完全符合,但能匹配部分內容,可用當前class+模糊定位contains,例如://android.widget.TextView[contains(@text,'重點管控')]
5.如果在當前class內無法通過以上4種辦法定位元素,則向上尋找元素的父節點或者祖父節點通過以上4種辦法定位,總之是找到能唯一定位且離元素最近的一個上層節點,例如://android.widget.RelativeLayout[@resource-id='com.space.grid.debug:id/address']/android.widget.ImageView[2]
ps:這里特別要強調的一點是android.widget.ImageView的index=1,但為什么寫法卻是android.widget.ImageView[2]下標為2,因為xpath的下標是從1開始的,沒有0
4、坐標點定位
如果上面說的幾種辦法都無法定位,那只能采用終極辦法,通過像素的坐標位置來定位元素了,比方我有個表單的選項是浮層,但工具沒辦法獲取到浮層中每個項,這個時候只能通過關鍵字Click A Point [ x | y]來定位元素
PS:但有一點要注意的是,由于不同手機的分辨率不同,坐標位置也是會有一定的差異,同一個腳本在不同手機上運行可能會有不同的結果