輔助工具
Android SDK在4.1中提供了如下工具來支持UI自動化測試:uiautomatorviewer – 一個圖形界面工具來掃描和分析應用的UI控件。
在sdk\tools\bin目錄下,有一個UIAutomatorviewer.bat文件,雙擊打開,如下圖(用於查找元素)
定位元素的方法:
根據resource-id定位:唯一,定位精確
driver.find_element_by_id()
根據text定位:
driver.find_element_by_name()
根據class定位:注意class不是唯一
driver.find_element_by_class_name()
根據content-desc定位:
driver.find_element_by_accessibility_id()
根據xpath定位:
driver.find_element_by_xpath()
可以看到我的這張圖片中,有xpath這一行,但是原生的UIAutomatorviewer是沒有的。圖片中的是LazyUiAutomatorViewer。
LazyUiAutomatorViewer是在UiAutomatorViewer源碼基礎上進行擴展,添加了xpath生成,頁面xpath自動一鍵抓取導出、選擇性抓取導出並自動生成java代碼的安卓UI自動化測試輔助工具。
將LazyUiAutomatorViewer 源碼編譯生成的jar包uiautomatorviewer.jar拷貝到安卓安裝目錄下的 \android-sdk\tools\lib 文件夾中替換掉原來的uiautomatorviewer.jar包。
源碼及jar包的下載地址:https://github.com/lazytestteam/lazyuiautomatorviewer; 雙擊安卓安裝目錄下的 \android-sdk\tools\uiautomatorviewer.bat 文件,啟動LazyUiAutomatorViewer 。
根據uiautomator定位(不記得從哪位大牛處整理過來的資料)
driver.find_element_by_android_uiautomator()
1. uiautomator text模糊定位
模糊定位故名思義,通過text的部分信息就能夠進行定位,我們直接看代碼:
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textContains("請輸入手")')
ele.send_keys("123")
在上面的代碼中我們只是將.text()的方法變成了.textContains(),在方法中傳入模糊的數據就好。看到這里是否有人思考過一個問題,既然有類似的模糊尋找,那么有沒有像正則表達式一樣的查找呢?答案是肯定的,看我們下面的方法。
2. textMatches 正則匹配查找
textMatches故名思義就是通過正則的來進行查找定位,他也是通過text的屬性來進行正則匹配,我們直接看代碼:
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^請輸入手.*")')
ele.send_keys("123")
上面匹配的一些信息可能一些剛做測試的小伙伴不是很了解,這個不要緊,下來可以搜索一下正則表達式教程,稍微了解一下就可以。
3. uiautomator resourceID定位
resourceId定位和appium封裝好的id定位是一樣的,只是這里將寫法變成了uiautomator的寫法而已,看下面代碼:
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("cn.com.open.mooc:id/et_phone_edit")')
ele.send_keys('234')
通過上面的代碼和之前的代碼對比大家可能發現其實他們前面都是一樣的,只是在定位的時候發生了一些變化,text變換成了resourceID即可,也就是頁面對象屬性的信息進行變更了,其他方法都是一樣。下面其他方法我就不浪費篇幅,只給大家做一個簡單的案例展示。
4. resourceIDMatches 定位
通過id進行正則匹配定位
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceIdMatches(".+et_phone_edit")')
ele.send_keys('234')
5.uiautomator className定位
通過調用android uiautomator使用className進行定位
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.EditText")')
ele.send_keys('234')
6. uiautomator classNameMatches定位
通過className正則匹配進行定位
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().classNameMatches (".*EditText")')
ele.send_keys('234')