一、前言
在 Android 自動化測試方面,Google 提供了一個基於 Java 開發的庫 UiAutomator,基本上支持所有的 Android 事件操作,使用簡單。
在此基礎上,有大佬開發出了一個 Python 的第三方庫 uiautomator,原理是在手機上運行了一個http rpc服務,將uiautomator中的功能開放出來。
在此之后,因為該庫太久沒有更新,又有大佬 fork 了一個版本,解決了一些問題,也增加了一些特性,使得功能更加強大了,這個庫就叫做 uiautomator2。
二、環境配置
1.ADB 環境
以 Windows 系統為例,首先需要下載一個 SDK 工具:https://developer.android.com/studio/releases/platform-tools,下載完成后解壓得到如下內容:
然后就是添加環境變量了,將該目錄路徑加入到環境變量中,添加完畢后打開 CMD 窗口輸入“adb version”命令,若出現如下內容,則表明環境變量配置成功:
2.Python 環境
要使用 uiautomator2,需要 Python3.6 以上的版本,Python 安裝成功以后,輸入“pip install uiautomator2”安裝 uiautomator2。
三、使用方法
首先需要一台開啟了開發者權限的安卓手機,部分手機的開啟步驟為:設置--關於手機--連續點擊版本號數次,開啟成功后可以在設置里找到類似“開發人員選項”的設置項,然后再打開“USB調試”功能,即可以通過 USB 連接對手機進行調試,最后將手機連接到電腦上,在 CMD 窗口中輸入“adb devices”查看當前連接的設備,如下圖所示即為連接成功:
手機成功連接后,執行如下命令,會在手機上安裝一些調試所需的程序,例如 atx-agent。
python -m uiautomator2 init
要對手機進行調試,最重要的問題就是如何定位元素,推薦使用工具 weditor 來解決這個問題,該工具只需要執行命令“pip install weditor”即可安裝,然后在 CMD 窗口中輸入“python -m weditor”會自動在瀏覽器中打開一個調試頁面,如下圖所示:
“Connect”按鈕用於連接設置,左側輸入框可以輸入設備號或者 IP 地址(即支持 USB 連接或者通過 WiFi 連接),“Dump Hierarchy”用於進行同步,當你操作手機后,頁面可能未同步,就可以點擊該按鈕進行同步。當然了,也可以在該頁面上直接操作手機,例如點擊元素、輸入內容等,使用還是很方便的。
四、命令簡介
1.連接設備
支持 USB 或者 WiFi 與設備進行連接,支持同時連接單個或多個設備。
1 import uiautomator2 as u2 2 3 4 # 一個設備時可簡寫,多個設備時添加設置號參數 5 d = u2.connect(
2.應用操作
1 import uiautomator2 as u2 2 3 4 d = u2.connect() 5 6 # 啟動指定應用 7 d.app_start("com.example.app") 8 # 啟動指定應用,啟動前停止此應用 9 d.app_start("com.example.app", stop=True) 10 # 停止指定應用 11 d.app_stop("com.example.app") 12 # 當前運行中的所有應用 13 d.app_list_running() 14 # 停止所有應用 15 d.app_stop_all() 16 # 安裝應用 17 d.app_install(data="./example.apk")
3.觸控操作
1 import uiautomator2 as u2 2 3 4 d = u2.connect() 5 6 # 點擊 7 d.click(1, 1) 8 # 雙擊 9 d.double_click(1, 1) 10 # 雙擊,指定間隔時間 11 d.double_click(1, 1, 0.1) 12 # 長按 13 d.long_click(1, 1) 14 # 長按,指定停留時間 15 d.long_click(1, 1, 5) 16 # 通過元素的文本信息進行點擊,會點擊文本所在元素的中心位置 17 d(text="Settings").click() 18 19 d.swipe(10, 10, 20, 20) 20 # 右滑 21 d.swipe_ext("right") 22 # 右滑,滑動距離為屏幕寬度的90% 23 d.swipe_ext("right", scale=0.9) 24 # 拖拽 25 d.drag(1, 1, 10, 10) 26 27 # 模擬按下 28 d.touch.down(10, 10) 29 # 模擬移動 30 d.touch.move(15, 15) 31 # 模擬抬起 32 d.touch.up()