簡介
? ? ? 乍眼一看,小伙伴們覺得這部分其實(shí)在異性兄弟那里就做過介紹和分享了,其實(shí)不然,上次介紹和分享的大哥是uiautomatorviewer,是一款定位工具。今天介紹的是一個(gè)java庫,提供執(zhí)行自動(dòng)化測試的各種API。
Android團(tuán)隊(duì)在4.1版本(API 16)中推出了一款全新的UI自動(dòng)化測試工具UiAutomator,用來幫助開發(fā)人員更有效率的完成App的Debug工作,同時(shí)對(duì)于測試人員也是一大福音,為什么這么說呢?

QA:“那個(gè)誰誰誰,我剛剛操作的時(shí)候,我發(fā)現(xiàn)了一個(gè)bug,你寫的App打開A頁面,再打開B頁面有時(shí)會(huì)出現(xiàn)閃屏問題。(內(nèi)心獨(dú)白:我去,這個(gè)奇怪的問題”
DEV:“嗯?還有這樣的問題,麻煩你復(fù)現(xiàn)給我看看。(內(nèi)心獨(dú)白:吹牛逼,我這么牛逼,我寫的App怎么會(huì)可能有bug,一定是你用的姿勢(shì)不對(duì))”
QA:一段忙碌的神操作之后...“咦,怎么不出現(xiàn)了?(內(nèi)心獨(dú)白:我去,怎么搞的啊,關(guān)鍵時(shí)刻掉鏈子,你倒是快點(diǎn)出來,讓我丟臉丟大發(fā)了)”
DEV:“那你先回去吧,復(fù)現(xiàn)再告訴我。(內(nèi)心獨(dú)白:呵呵,和我心里想的一樣,我寫的怎么可能會(huì)有bug呢)”
幾天過去了......
QA:滿心歡喜狀,那個(gè)誰誰誰“上次那個(gè)問題我復(fù)現(xiàn)了,操作給你看....我去,怎么又不出現(xiàn)了!(內(nèi)心獨(dú)白:一臉淫笑,我說有bug,你讓我復(fù)現(xiàn),這又回復(fù)現(xiàn)出來吧,剛想完。。。。。額。又看不到了,怎么搞的,氣死我)”
DEV:“是不是設(shè)備有問題,你換個(gè)設(shè)備再試試呢?(內(nèi)心獨(dú)白:小樣,都和你說了沒有bug你不信非要復(fù)現(xiàn))”
QA:“寶寶心里苦,但是寶寶不說!(內(nèi)心獨(dú)白:這個(gè)。唉。。。。。。。)”
有了UiAutomator之后:
QA:“我發(fā)現(xiàn)了一個(gè)bug,你寫的App打開A頁面,再打開B頁面有時(shí)會(huì)出現(xiàn)閃屏問題。”
DEV:“這個(gè)簡單,我用UiAutomator寫個(gè)測試用例,分分鐘解決。(內(nèi)心獨(dú)白:牛氣哄哄的)”
QA:“厲害了Word哥!(內(nèi)心獨(dú)白:真特么牛逼,愛死你了)”
全劇終!
UiAutomator提供了以下兩種工具來支持UI自動(dòng)化測試:
-
uiautomatorviewer:用來分析UI控件的圖形界面工具,位于SDK目錄下的tools文件夾中。
-
uiautomator:一個(gè)java庫,提供執(zhí)行自動(dòng)化測試的各種API。
1、android uiautomator text定位
可能有人不知道為什么說android?uiautomator是終極定位,而且android?uiautomator和appium有什么關(guān)系呢?如果之前寫了一些腳本,發(fā)現(xiàn)有的時(shí)候一些元素不能夠很好的定位時(shí),那么就需要采用android?uiautomator去定位,它是一種非常強(qiáng)有力的定位方式,原理是通過android 自帶的android uiautomator的類庫去查找元素,都直接用官方公布出來的方法去找了還能找不到嗎?
首先和宏哥一起看一下下面的圖片:
?
?
在上面的圖片中我們不采用appium封裝好的方法,直接使用android 的uiautomator去定位結(jié)果如下:
1 user = new Uiobject( new UiSelector().text( " 請(qǐng)輸入淘寶賬戶 " )) 2 user.setText( " test " )
這兩句話看不懂也沒關(guān)系,因?yàn)槲覀兘酉聛碇v的是appium已經(jīng)對(duì)他進(jìn)行了封裝的方法,這里只是讓你看一下他原始方法是怎么做的。首先他會(huì)根據(jù)你的定位信息new一個(gè)對(duì)象出來,然后再在你new的對(duì)象之上進(jìn)行相關(guān)操作。下面我們看一下在appium中的實(shí)現(xiàn)方法:
1 ele = self.driver.find_element_by_android_uiautomator( ' new UiSelector().text("請(qǐng)輸入淘寶賬戶") ' ) 2 ele.send_keys( " 123 " )
對(duì)比兩種代碼的寫法,我們可以發(fā)現(xiàn)他們的相同之處只是最后的定位信息是一樣的,即:new UiSelector().text("請(qǐng)輸入淘寶賬戶"),這句話是什么意思呢?簡單的話就是根據(jù)一定條件來查找元素,我們這里的條件就是text屬性為“請(qǐng)輸入淘寶賬戶”,再根據(jù)圖片去理解是不是很容易呢?android uiautomator的元素定位其實(shí)和appium的定位一樣,或者說它比appium的定位方式更加多以及更加適用,并不是只有這一個(gè),它也不僅支持className、id等定位,而且還支持模糊匹配進(jìn)行定位,這樣是不是感覺更高大上呢?下面我們簡單介紹一下這幾種定位方式。
2 、uiautomator text模糊定位
模糊定位故名思義,通過text的部分信息就能夠進(jìn)行定位,我們直接看代碼:
1 ele = self.driver.find_element_by_android_uiautomator( ' new UiSelector().textContains("請(qǐng)輸入淘") ' ) 2 ele.send_keys( " 123 " )
在上面的代碼中我們只是將.text()的方法變成了.textContains(),在方法中傳入模糊的數(shù)據(jù)就好。看到這里是否有人思考過一個(gè)問題,既然有類似的模糊尋找,那么有沒有像正則表達(dá)式一樣的查找呢?答案是肯定的,看我們下面的方法。
3、 textMatches 正則匹配查找
textMatches故名思義就是通過正則的來進(jìn)行查找定位,他也是通過text的屬性來進(jìn)行正則匹配,我們直接看代碼:
1 ele = self.driver.find_element_by_android_uiautomator( ' new UiSelector().textMatches("^請(qǐng)輸入淘.*") ' ) 2 ele.send_keys( " 123 " )
上面匹配的一些信息可能一些剛做測試的小伙伴不是很了解,這個(gè)不要緊,下來可以搜索一下正則表達(dá)式教程,稍微了解一下就可以。
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 ' )
通過上面的代碼和之前的代碼對(duì)比大家可能發(fā)現(xiàn)其實(shí)他們前面都是一樣的,只是在定位的時(shí)候發(fā)生了一些變化,text變換成了resourceID即可,也就是頁面對(duì)象屬性的信息進(jìn)行變更了,其他方法都是一樣。下面其他方法我就不浪費(fèi)篇幅,只給大家做一個(gè)簡單的案例展示。
5、 resourceIDMatches 定位
通過id進(jìn)行正則匹配定位
1 ele = self.driver.find_element_by_android_uiautomator( ' new UiSelector().resourceIdMatches(".+aliuser_login_account_et") ' ) 2 ele.send_keys( ' 234 ' )
6、uiautomator className定位
通過調(diào)用android uiautomator使用className進(jìn)行定位
1 ele = self.driver.find_element_by_android_uiautomator( ' new UiSelector().className("android.widget.EditText") ' ) 2 ele.send_keys( ' 234 ' )
7、 uiautomator classNameMatches定位
通過className正則匹配進(jìn)行定位
1 ele = self.driver.find_element_by_android_uiautomator( ' new UiSelector().classNameMatches (".*EditText") ' ) 2 ele.send_keys( ' 234 ' )
通過上面的學(xué)習(xí)我相信大家對(duì)uiautomator的定位有一定的了解了,但是我想告訴大家的是這個(gè)并不是所有的,還有很多很多的定位方式,這個(gè)需要大家在以后不斷的學(xué)習(xí)中去積累,我也不可能把所有的方法都告訴大家,這里只是給大家一個(gè)起頭,但是我希望大家在學(xué)習(xí)定位的時(shí)候不只是看appium的定位,畢竟他也是封裝的uiautomator的定位方式,所以在學(xué)習(xí)appium的同時(shí)把uiautomator去大概學(xué)習(xí)一下這個(gè)很有幫助,并且對(duì)以后的提升自己以及工作中重新封裝appium有很大的幫助。
8、小結(jié)
1、以前運(yùn)行工具沒有問題。今天使用uiautomatorviewer 查看android某些頁面元素,出現(xiàn)錯(cuò)誤Error obtaining UI hierarchy? Reason: Error taking device screenshot: null 如圖:
再網(wǎng)上找了很多解決辦法依然沒解決
宏哥總結(jié)了一下原因:
1、該app不支持該頁面的截屏功能所以u(píng)iautomatorviewer捕捉不到
2、手機(jī)需要重啟
3、非原裝數(shù)據(jù)線
4、appium服務(wù)異常需要重新連接
5、可以嘗試切換USB接口
6、最后可以把手機(jī)開發(fā)者選項(xiàng)的USB調(diào)試撤銷權(quán)限,在重新獲取
最后記住重啟再重啟解決一切問題,可能這次報(bào)錯(cuò)了,但是重啟之后就成功了,這個(gè)一般是沒地方說理的。
支持宏哥的朋友們和宏哥的宏粉記得點(diǎn)波推薦哦,您的肯定就是我進(jìn)步的動(dòng)力。宏哥先在這里給您道謝了,謝您嘞~~
個(gè)人公眾號(hào)
? ? ? ? ? ? ?
?
?
?
?
微信群
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
