老規(guī)矩:先給解決方案,再解釋。
先給出解決方案
在網(wǎng)上找了很多辦法都無(wú)效,但是可能其它人是有效的,以下為幾種解決辦法:
- 在cmd命令窗口中輸入 adb root 即可;
- 重啟手機(jī)無(wú)效;
- 重新把手機(jī)拔了再插;
- 重啟appuim;
- 重啟uiautomatorviewer.bat;
- 打開(kāi)手機(jī)開(kāi)發(fā)者權(quán)限,將USB調(diào)試按鈕重新啟動(dòng)就好了;
好吧,以上所有方法都試完了,如果解決了,恭喜你們,我不符合以上情況。 - 各總嘗試后發(fā)現(xiàn):關(guān)閉界面中的動(dòng)態(tài)不停地進(jìn)行繪制的元素-進(jìn)度條(成功)。
以下是我?guī)捉?jīng)周折尋找解決方案的記錄,如果只是為了解決問(wèn)題,不需要知道原因的,可以不用往下看了。
產(chǎn)生的原因
- 發(fā)現(xiàn)問(wèn)題:下午測(cè)試經(jīng)理找我,要用自動(dòng)化測(cè)試,需要使用安卓的開(kāi)發(fā)工具uiautomatorviewer獲取頁(yè)面元素進(jìn)行定位,發(fā)現(xiàn)人家淘寶、京東、支付寶都能成功定位,咱們app定位不了;
- 我立即打開(kāi)本地的uiautomatorviewer.bat,執(zhí)行Screenshot,唉可以啊,沒(méi)問(wèn)題。告訴測(cè)試經(jīng)理:你的sdk工具版本太低了,把自己的tools文件打包,“瀟灑”地發(fā)給了測(cè)試經(jīng)理;
-
過(guò)了一會(huì)兒,測(cè)試經(jīng)理又說(shuō),換完了還是不行???我看了下她的截圖:是首頁(yè),我截的是啟動(dòng)屏,于是我嘗試了首頁(yè),果然也不行;二級(jí)頁(yè)面-可以;所以問(wèn)題不在工具上,在界面元素上;出錯(cuò)問(wèn)題截圖:
image.png - 測(cè)試經(jīng)理問(wèn)咱是不是用了啥新技術(shù)了,導(dǎo)致截不了;我回想了一下頁(yè)面的開(kāi)發(fā)組成,大致瀏覽了首頁(yè)的組成結(jié)構(gòu):懸浮球、cardview、viewpager、下拉刷新、輪播、跑馬燈、GifImageView,LottieAnimationView,webview;看完之后發(fā)現(xiàn)頁(yè)面里也沒(méi)有特殊的東西,因?yàn)閯e的頁(yè)面也都引用的有這些元素,界面截取定位都沒(méi)問(wèn)題,唯一特例的是Lottie(Lottie是Airbnb開(kāi)源的一個(gè)支持 Android、iOS 以及 ReactNative,利用json文件的方式快速實(shí)現(xiàn)動(dòng)畫(huà)效果的庫(kù):https://github.com/airbnb/lottie-android),其它地方?jīng)]有用到。
-
于是將首頁(yè)的Lottie元素在二級(jí)頁(yè)面引用,然后嘗試截取,依然沒(méi)問(wèn)題,說(shuō)明跟Lottie無(wú)關(guān)。首先,配置、連接、設(shè)備環(huán)境肯定沒(méi)問(wèn)題(因?yàn)閯e的頁(yè)面可以截取定位)那么肯定跟界面里的元素有關(guān),最有可能出問(wèn)題的就是那些動(dòng)態(tài)元素--因?yàn)?..后面解釋原因。與Lottie無(wú)關(guān)、與Gif無(wú)關(guān)、懸浮球、跑馬燈關(guān)掉也不行,排除這些后,將目光聚焦到了頂部輪播那里,上個(gè)版本在首頁(yè)輪播那加了一個(gè)動(dòng)效(當(dāng)前輪播圖倒計(jì)時(shí)更換,有一個(gè)進(jìn)度指示器一直在跑。之前沒(méi)考慮輪播是因?yàn)槠渌?yè)面也有輪播,但是其它頁(yè)面沒(méi)有做這個(gè)跑進(jìn)度的效果)
image.png - 停掉輪播進(jìn)度指示
psv_top.setShowProgress(false);
Success:成功獲取首頁(yè)界面元素,發(fā)現(xiàn)世界都清爽了許多。

解釋
- uiautomator在獲取界面狀態(tài)信息時(shí),首先要等界面處于idle空閑狀態(tài)才會(huì)做dump操作。而顯示進(jìn)度那里每秒鐘就要繪制10次進(jìn)度,idle沒(méi)有足夠空閑的時(shí)間去完成uiautomator的dump操作。這就是uiautomator死活拿不到動(dòng)態(tài)界面信息的原因。
- 我之所以之前沒(méi)有考慮輪播的原因,是因?yàn)槠渌?jí)頁(yè)面也有輪播,還是一個(gè)輪播控件也能截取成功(只有首頁(yè)開(kāi)啟了進(jìn)度指示器的特效)。所以很多難題很多情況下都是很小的細(xì)節(jié)硬性的,一定要冷靜下拉仔細(xì)分析原因,才能找到最終的答案。
補(bǔ)充
uiautomatorviewer使用簡(jiǎn)介:
-
進(jìn)入以下目錄,Androidsdk-tools-bin,雙擊uiautomatorviewer.bat,
image.png -
然后彈出UI Automator Viewer窗口,按截圖操作,獲取當(dāng)前頁(yè)面,然后點(diǎn)擊相應(yīng)的元素,可以獲取相應(yīng)的元素的相關(guān)信息
image.png



