關于app自動化測試,元素定位工具有三個:
appium自帶的Appium Inspector工具
Android ADT原生的工具
python版uiautomator2中的weditor
由于我常用的是前兩個,所以下面只介紹前面兩種元素定位工具(以下內容中均以微博為例子)
一、元素定位工具
(一).Appium Inspector
使用該工具的使用前提:
1.客戶端通過adb devices的dos命令確認是否連接設備
2.當前連接的設備是否被其它應用程序占用
3.已安裝appium desktop(appium的desktop下載地址:http://appium.io/)
使用步驟如下:
1.啟動appium服務器,點擊右上角的第一個按鈕(放大鏡按鈕),如下圖:

2.進入后頁面顯示如下圖所示,一般情況下都選擇本地服務

3.參數(shù)設置完成后點擊右下角的Start Session,進入如下圖所示頁面

在該頁面就可以進行元素定位了
(二).uiautomatorviewer—僅限Android設備使用
使用該工具的使用前提:
1.客戶端通過adb devices的adb命令確認是否連接Android設備
2.當前連接的設備是否被其它應用程序占用
3.具有運行Android SDK功能的Windows
4.安裝jdk1.8(由于目前不支持jdk1.8以上的版本,需要使用該工具要安裝jdk1.8的版本)
5.使用Android5.0以上系統(tǒng)
6.確保為設備打開了開發(fā)人員模式,并打開USB調試
安裝:
1.在android studio的啟動頁面當中,選擇右下角的configure -> SDK Manager會彈出如圖:選擇android SDK -> SDK Tools,按圖中勾選,點擊ok進入安裝,安裝完成即可關閉android studio。記住圖中Android SDK Location對應

2.在Android studio中找到SDK,找到uiautomator,存放的位置為:D:\Android-SDK\tools\bin\uiautomatorviewer.bat
使用步驟如下:
1.找到uiautomatorviewer.bat文件,雙擊打開

2.開啟后頁面顯示如下圖:


3.若在定位時出現(xiàn)下圖問題,可以嘗試以下幾種解決方法:

查看手機是否開啟開發(fā)者權限,打開USB調試
在adb命令提示符中輸入adb devices查看手機是否連接到PC端,再使用adb shell是否能進入到手機(exit退出)
應用程序是否被占用
關閉uiautomatorviewer,重新打開是否能定位到
(三).兩種定位工具的區(qū)別
appium inspector需要啟動appium服務器,填寫Appium Desired Capabilities,略顯麻煩,而uiautomatorviewer只需要連接手機
appium inspector實時獲取當前頁面布局,而uiautomatorviewer方便存儲,不需要實時獲取
appium inspector在操作App到下一頁面時,刷新后經(jīng)常會看到在轉圈圈,很久都沒有更新
appium inspector中控件屬性有xpath的絕對定位,而uiautomatorviewer沒有xpath的絕對定位
uiautomatorviewer獲取頁面布局時經(jīng)常會獲取不到
每種工具都有缺陷,選擇最適合自己的就好啦
三、元素定位的方法
下面介紹幾種元素定位方式,常見的元素定位方式是前三種
(一).ID定位
id對應控件屬性列表中的:resource-id
driver.find_element_by_id("com.sina.weibo:id/tv_title_lookaround")
(二).XPATH定位
xpath對應控件屬性列表中的:xpath(絕對定位只有appium inspector中才有)
# 絕對定位
driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout[2]/android.widget.LinearLayout/android.widget.TextView")
# 相對定位
driver.find_element_by_xpath("http://android.widget.Button[@text='登錄']")
(三).CLASSNAME定位
classname對應控件屬性列表中的:class
注意:由于一個頁面中可能會存在多個按鈕的classname一致,但使用classname定位時,默認選擇頁面中的第一個classname,可以將所有classname相同的元素放置在一個list列表中,點擊你所需要的位置的元素即可(列表中的元素從0開始)
driver.find_element_by_class_name("android.widget.TextView")
(四).accessibility定位
accessibility對應控件屬性列表中的:content-desc
driver.find_element_by_accessibility_id("請輸入手機號或郵箱")
(五).text定位
text對應控件屬性列表中的:text
driver.find_element_by_name("登錄")
(六).其它定位
元素定位除了使用find_element_by_xxx,還可以使用page_source,page_source能夠查找到這個頁面的所有元素,再通過if/else來查找目標元素是否存在于頁面中
page_source = self.driver.page_source
? ? ? ? ? ? if "image_cancel" in page_source:
? ? ? ? ? ? ? ? self.driver.find_element(*locator).click()
? ? ? ? ? ? elif "tips" in page_source:
? ? ? ? ? ? ? ? pass
關于PO模式的元素定位方式,會在后面PO模式時再進行介紹