uiautomator2 入門教程

TM0831發表於2021-07-25

一、前言

  在 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()