Appium+python自動化(十二)- Android UIAutomator終極定位凶器(超詳解)

巨集哥發表於2019-07-03

簡介

      乍眼一看,小夥伴們覺得這部分其實在異性兄弟那裡就做過介紹和分享了,其實不然,上次介紹和分享的大哥是uiautomatorviewer,是一款定位工具。今天介紹的是一個java庫,提供執行自動化測試的各種API。

  Android團隊在4.1版本(API 16)中推出了一款全新的UI自動化測試工具UiAutomator,用來幫助開發人員更有效率的完成App的Debug工作,同時對於測試人員也是一大福音,為什麼這麼說呢?

 
 

QA:“那個誰誰誰,我剛剛操作的時候,我發現了一個bug,你寫的App開啟A頁面,再開啟B頁面有時會出現閃屏問題。(內心獨白:我去,這個奇怪的問題”

DEV:“嗯?還有這樣的問題,麻煩你復現給我看看。(內心獨白:吹牛逼,我這麼牛逼,我寫的App怎麼會可能有bug,一定是你用的姿勢不對)”

QA:一段忙碌的神操作之後...“咦,怎麼不出現了?(內心獨白:我去,怎麼搞的啊,關鍵時刻掉鏈子,你倒是快點出來,讓我丟臉丟大發了)”

DEV:“那你先回去吧,復現再告訴我。(內心獨白:呵呵,和我心裡想的一樣,我寫的怎麼可能會有bug呢)”

幾天過去了......

QA:滿心歡喜狀,那個誰誰誰“上次那個問題我復現了,操作給你看....我去,怎麼又不出現了!(內心獨白:一臉淫笑,我說有bug,你讓我復現,這又回覆現出來吧,剛想完。。。。。額。又看不到了,怎麼搞的,氣死我)”

DEV:“是不是裝置有問題,你換個裝置再試試呢?(內心獨白:小樣,都和你說了沒有bug你不信非要復現)”

QA:“寶寶心裡苦,但是寶寶不說!(內心獨白:這個。唉。。。。。。。)”

有了UiAutomator之後:

QA:“我發現了一個bug,你寫的App開啟A頁面,再開啟B頁面有時會出現閃屏問題。”

DEV:“這個簡單,我用UiAutomator寫個測試用例,分分鐘解決。(內心獨白:牛氣哄哄的)”

QA:“厲害了Word哥!(內心獨白:真特麼牛逼,愛死你了)”

全劇終!

UiAutomator提供了以下兩種工具來支援UI自動化測試:

  • uiautomatorviewer:用來分析UI控制元件的圖形介面工具,位於SDK目錄下的tools資料夾中。

  • uiautomator:一個java庫,提供執行自動化測試的各種API。

1、android uiautomator text定位

  可能有人不知道為什麼說android uiautomator是終極定位,而且android uiautomator和appium有什麼關係呢?如果之前寫了一些指令碼,發現有的時候一些元素不能夠很好的定位時,那麼就需要採用android uiautomator去定位,它是一種非常強有力的定位方式,原理是通過android 自帶的android uiautomator的類庫去查詢元素,都直接用官方公佈出來的方法去找了還能找不到嗎?

  首先和巨集哥一起看一下下面的圖片:

 

 

在上面的圖片中我們不採用appium封裝好的方法,直接使用android 的uiautomator去定位結果如下:

1 user = new Uiobject(new UiSelector().text("請輸入淘寶賬戶"))
2 user.setText("test")

  這兩句話看不懂也沒關係,因為我們接下來講的是appium已經對他進行了封裝的方法,這裡只是讓你看一下他原始方法是怎麼做的。首先他會根據你的定位資訊new一個物件出來,然後再在你new的物件之上進行相關操作。下面我們看一下在appium中的實現方法:

1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().text("請輸入淘寶賬戶")')
2 ele.send_keys("123")

  對比兩種程式碼的寫法,我們可以發現他們的相同之處只是最後的定位資訊是一樣的,即:new UiSelector().text("請輸入淘寶賬戶"),這句話是什麼意思呢?簡單的話就是根據一定條件來查詢元素,我們這裡的條件就是text屬性為“請輸入淘寶賬戶”,再根據圖片去理解是不是很容易呢?android uiautomator的元素定位其實和appium的定位一樣,或者說它比appium的定位方式更加多以及更加適用,並不是只有這一個,它也不僅支援className、id等定位,而且還支援模糊匹配進行定位,這樣是不是感覺更高大上呢?下面我們簡單介紹一下這幾種定位方式。

2 、uiautomator text模糊定位

  模糊定位故名思義,通過text的部分資訊就能夠進行定位,我們直接看程式碼:

1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textContains("請輸入淘")')
2 ele.send_keys("123")

  在上面的程式碼中我們只是將.text()的方法變成了.textContains(),在方法中傳入模糊的資料就好。看到這裡是否有人思考過一個問題,既然有類似的模糊尋找,那麼有沒有像正規表示式一樣的查詢呢?答案是肯定的,看我們下面的方法。

3、 textMatches 正則匹配查詢

  textMatches故名思義就是通過正則的來進行查詢定位,他也是通過text的屬性來進行正則匹配,我們直接看程式碼:

1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^請輸入淘.*")')
2 ele.send_keys("123")

  上面匹配的一些資訊可能一些剛做測試的小夥伴不是很瞭解,這個不要緊,下來可以搜尋一下正規表示式教程,稍微瞭解一下就可以。

4、 uiautomator resourceID定位

  resourceId定位和appium封裝好的id定位是一樣的,只是這裡將寫法變成了uiautomator的寫法而已,看下面程式碼:

1 1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.taobao.taobao:id/aliuser_login_account_et")')
2 2 ele.send_keys('234')

  通過上面的程式碼和之前的程式碼對比大家可能發現其實他們前面都是一樣的,只是在定位的時候發生了一些變化,text變換成了resourceID即可,也就是頁面物件屬性的資訊進行變更了,其他方法都是一樣。下面其他方法我就不浪費篇幅,只給大家做一個簡單的案例展示。

5、 resourceIDMatches 定位

  通過id進行正則匹配定位

1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceIdMatches(".+aliuser_login_account_et")')
2 ele.send_keys('234')

6、uiautomator className定位

  通過呼叫android uiautomator使用className進行定位

1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.EditText")')
2 ele.send_keys('234')

7、 uiautomator classNameMatches定位

  通過className正則匹配進行定位

1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().classNameMatches (".*EditText")')
2 ele.send_keys('234')

  通過上面的學習我相信大家對uiautomator的定位有一定的瞭解了,但是我想告訴大家的是這個並不是所有的,還有很多很多的定位方式,這個需要大家在以後不斷的學習中去積累,我也不可能把所有的方法都告訴大家,這裡只是給大家一個起頭,但是我希望大家在學習定位的時候不只是看appium的定位,畢竟他也是封裝的uiautomator的定位方式,所以在學習appium的同時把uiautomator去大概學習一下這個很有幫助,並且對以後的提升自己以及工作中重新封裝appium有很大的幫助。

8、小結

1、以前執行工具沒有問題。今天使用uiautomatorviewer 檢視android某些頁面元素,出現錯誤Error obtaining UI hierarchy  Reason: Error taking device screenshot: null 如圖:

再網上找了很多解決辦法依然沒解決

巨集哥總結了一下原因:

1、該app不支援該頁面的截圖功能所以uiautomatorviewer捕捉不到

2、手機需要重啟

3、非原裝資料線

4、appium服務異常需要重新連線

5、可以嘗試切換USB介面

6、最後可以把手機開發者選項的USB除錯撤銷許可權,在重新獲取

最後記住重啟再重啟解決一切問題,可能這次報錯了,但是重啟之後就成功了,這個一般是沒地方說理的。

支援巨集哥的朋友們和巨集哥的巨集粉記得點波推薦哦,您的肯定就是我進步的動力。巨集哥先在這裡給您道謝了,謝您嘞~~

個人公眾號

             

 

 

 

 

微信群

 

相關文章