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

2.進(jìn)入后頁(yè)面顯示如下圖所示,一般情況下都選擇本地服務(wù)

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

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

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

2.開(kāi)啟后頁(yè)面顯示如下圖:


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

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