天天看點

幹貨 | 一文搞定 uiautomator2 自動化測試工具使用

作者:霍格沃茲測試

Google 官方提供了一個 Android 自動化測試工具(Java 庫),基于 Accessibility 服務,功能很強,可以對第三方 App 進行測試,擷取螢幕上任意一個 App 的任意一個控件屬性,并對其進行任意操作,但有兩個缺點:

1.測試腳本隻能使用 Java 語言;

2.測試腳本要打包成 jar 或者 apk 包上傳到裝置上才能運作;

實際工作中,我們希望測試邏輯能夠用 Python 編寫,能夠在電腦上運作的時候就控制手機。是以基于這個目的開發了 python-uiautomator2 自動化測試開源工具,其封裝了谷歌自帶的 uiautomator2 測試架構,可以運作在支援 Python 的任一系統上,目前版本為 V2.10.2。

GitHub 開源位址:

如圖所示,python-uiautomator2 主要分為兩個部分,python 用戶端,移動裝置

  • python 端: 運作腳本,并向移動裝置發送 HTTP 請求;
  • 移動裝置:移動裝置上運作了封裝了 uiautomator2 的 HTTP 服務,解析收到的請求,并轉化成 uiautomator2 的代碼;

    整個過程:

    3.在移動裝置上安裝 atx-agent(守護程序),随後 atx-agent 啟動 uiautomator2 服務(預設 7912 端口)進行監聽;

    4.在 PC 上編寫測試腳本并執行(相當于發送 HTTP 請求到移動裝置的 server 端);

    5.移動裝置通過 WIFI 或 USB 接收到 PC 上發來的 HTTP 請求,執行制定的操作;

    使用 pip 安裝

    安裝完成後,使用如下 python 代碼檢視環境是事配置成功

    說明:後文中所有代碼都需要導入 uiautomator2 庫,為了簡化我使用 u2 代替,d 代表 driver

    能正确列印出裝置的資訊則表示安裝成功

    注意:需要安裝 adb 工具,并配置到系統環境變量,才能操作手機。

    安裝有問題可以到 issue 清單查詢:

    weditor 是一款基于浏覽器的 UI 檢視器,用來幫助我們檢視 UI 元素定位。

    因為 uiautomator 是獨占資源,是以當 atx 運作的時候 uiautomatorviewer 是不能用的,為了減少 atx 頻繁的啟停,就需要用到此工具

    使用 pip 安裝

    檢視安裝是否成功

    出現如下資訊表示安裝成功

    運作 weditor

    ui2 支援 android 中 UiSelector 類中的所有定位方式,詳細可以在這個網址檢視 https://developer.android.com/reference/android/support/test/uiautomator/UiSelector

    整體内容如下 , 所有的屬性可以通過 weditor 檢視到

幹貨 | 一文搞定 uiautomator2 自動化測試工具使用

子元素定位

child()

兄弟元素定位

sibling()

鍊式調用

相對定位支援在left, right, top, bottom, 即在某個元素的前後左右

表格标注有 @property 裝飾的類屬性方法,均為下方示例方式

幹貨 | 一文搞定 uiautomator2 自動化測試工具使用

exists 其它使用方法:

info() 輸出資訊:

可以通過上方資訊分别擷取元素的所有屬性

因為 Java uiautoamtor 中預設是不支援 xpath,這是屬于 ui2 的擴充功能,速度會相比其它定位方式慢一些

在 xpath 定位中,ui2 中的 description 定位需要替換為 content-desc,resourceId 需要替換為 resource-id

使用方法

Android<4.3 時不能使用拖動

滑動有兩個,一個是在 driver 上操作,一個是在元素上操作

元素上操作

從元素的中心向元素邊緣滑動

driver 上操作

即對整個螢幕操作

driver 滑動的擴充方法,可以直接實作滑動,不需要再自己封裝定位點

android>4.3

對元素操作

封裝好的放大縮小操作

設定 scrollable 屬性為 True;

滾動類型:horiz 為水準,vert 為垂直;

滾動方向:

  • forward 向前
  • backward 向後
  • toBeginning 滾動至開始
  • toEnd 滾動至最後
  • to 滾動直接某個元素出現

    所有方法均傳回 Bool 值;

    5.8.1 輸入自定義文本

    5.8.2 輸入按鍵

    兩種方法

    目前 press 支援的按鍵如下

    keyevent 是通過 “adb shell input keyevent” 方式輸入,支援按鍵更加豐富

    更多詳細的按鍵資訊 https://developer.android.com/reference/android/view/KeyEvent.html

    5.8.3 輸入法切換

    5.8.4 模拟輸入法功能

    可以模拟的功能有 go ,search ,send ,next, done ,previous。

    如果使用 press 輸入按鍵無效,可以嘗試使用此方法輸入

    使用 wather 進行界面的監控,可以用來實作跳過測試過程中的彈框

    當啟動 wather 時,會建立一個線程進行監控

    可以添加多個 watcher

    用法

    2.11.0 版本 新增了一個 watch_context 方法 , 寫法相比 watcher 更簡潔,官方推薦使用此方法來實作監控,目前隻支援 click() 這一種方法。

    這裡可以用來實作圖案解鎖

    使用 touch 類

    這個感覺是比較有用的一個功能,可以在測試用例開始時錄制,結束時停止錄制,然後如果測試 fail。則上傳到測試報告,完美複原操作現場,具體原理後面再去研究。

    首先需要下載下傳依賴,官方推薦使用鏡像下載下傳:

    執行錄制:

    下載下傳與錄制視訊同一套依賴。

    這個功能是首先手動截取需要點選目标的圖檔,然後 ui2 在界面中去比對這個圖檔,目前我嘗試了精确試不是很高,誤點率非常高,不建議使用。

    可以從本地路徑及 url 下載下傳安裝 APP,此方法無傳回值,當安裝失敗時,會抛出 RuntimeError 異常

    預設當應用在運作狀态執行 start 時不會關閉應用,而是繼續保持目前界面。

    如果需要消除前面的啟動狀态,則需要加 stop=True 參數。

    stop 和 clear 的差別是結束應用使用的指令不同

    stop 使用的是 “am force-stop”

    clear 使用的是 “pm clear”

    解除安裝全部應用傳回的包名清單并一定是解除安裝成功了,最好使用 verbose=true 列印一下資訊,這樣可以檢視到是否解除安裝成功

    或者可以修改一下源碼,使其隻輸出成功的包名,注釋的為增加的代碼,未注釋的是源碼

    connect() 可以使用如下其它方式進行連接配接

    8.2.1 擷取 driver 資訊

    8.2.2 擷取裝置資訊

    會輸出測試裝置的所有資訊,包括電池,CPU,記憶體等

    8.2.3 擷取螢幕分辨率

    8.2.4 擷取 IP 位址

    8.3.1 使用 settings 設定

    檢視 settings 預設設定

    修改預設設定,隻需要修改 settings 字典即可

    8.3.2 使用方法或者屬性設定

  • http 預設請求逾時時間
  • 當裝置掉線時,等待裝置線上時長
  • 元素查找預設等待時間
  • 打開 HTTP debug 資訊
  • 休眠

    value 值參考,隻要是元組中的任一一個值就可以。

    打開通知欄

    打開快速設定

    8.7.1 導入檔案

    8.7.2 導出檔案

    使用 shell 方法執行

    8.8.1 執行非阻塞指令

    output 傳回的是一個整體的字元串,如果需要抽取值,需要對 output 進行解析提取處理

    8.8.2 執行阻塞指令(持續執行的指令)

    源碼描述

    因為有 atx-agent 的存在,Uiautomator 會被一直守護着,如果退出了就會被重新啟動起來。但是 Uiautomator 又是霸道的,一旦它在運作,手機上的輔助功能、電腦上的 uiautomatorviewer 就都不能用了,除非關掉該架構本身的 uiautomator

    使用代碼停止

    手動停止

    直接打開 ATX APP(init 成功後,就會安裝上),點選關閉 UIAutomator

    以上,歡迎大家一起交流探讨。

更多學習資料點選下方

Redirecting...

繼續閱讀