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


簡介

      乍眼一看,小伙伴們覺得這部分其實在異性兄弟那里就做過介紹和分享了,其實不然,上次介紹和分享的大哥是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調試撤銷權限,在重新獲取

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

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

個人公眾號

             

 

 

 

 

微信群

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM