Python 自動化,Appium 憑什么使用 UiAutomator2?
點擊上方“AirPython”,選擇“加為星標”
第一時間關(guān)注 Python 技術(shù)干貨!

1. UiAutomator2 是什么
可能很多人對?UiAutomator2?和?UiAutomator?傻傻分不清楚
UiAutomator?是 Google 開發(fā)的一款運行在 Android 設(shè)備上的 UI 自動化測試工具,基于JAVA語言,使用它有一個限制,就是必須打包成 APK 或 JAR,然后上傳到設(shè)備,才能運行
事實上,UiAutomator2?同樣有?JAVA和 Python 版,今天我們聊的是 Python 版本的 UiAutomator2
至于 JAVA 版本的可以參考之前寫的文章:點我查看
Python 版本的 UiAutomator2 項目地址:
https://github.com/openatx/uiautomator2
2.Appium 和?UiAutomator2
作為移動端自動化的鼻祖,早期版本的 Appium 是基于 UiAutomator?和 Bootstrap.jar
其中,Bootstrap 在 Appium初始化的時候,被推送到 Android 設(shè)備上,負責監(jiān)聽 Appium 發(fā)過來的請求,并轉(zhuǎn)換后發(fā)送給 UiAutomator 去處理,完成自動化操作
最新版本的 Appium 加入了對 UiAutomator2 的支持,原理進行了更新,功能和穩(wěn)定性更加完善
原理圖可以參考:

3.準備
在使用?UiAutomator2 之前,需要做如下準備
1、在 PC 端配置 Android 開發(fā)環(huán)境
2、使用 pip 安裝?uiautomator2?依賴
#?安裝依賴
pip3?install?-U?uiautomator2
#?如果需要截屏,需要安裝pillow
pip3?install?pillow
3、在手機上安裝?atx-agent?應用?
ps:atx-agent 作為服務(wù)端,一直運行在后臺
#?安裝apk服務(wù)到手機上
python?-m?uiautomator2?init4、安裝 weditor
WEditor?通過 ip 連接手機,即可以實時查看 App 的界面元素信息
和 Appium DeskTop 類似,可以模擬點擊、滑動操作、生成操作源碼等功能
首先,通過 pip 安裝 weditor 依賴包
#?基于瀏覽器查看?App?的界面元素
pip3?install?-U?weditor然后,在命令行輸入 weditor,會自動在瀏覽器中打開,接著通過 ip 連接對應的設(shè)備,即可以獲取設(shè)備端當前界面的控件信息
信息內(nèi)容包含:控件的層級關(guān)系、控件 ID、文本內(nèi)容、坐標值等內(nèi)容

4.實戰(zhàn)一下
還是以閑魚搜索商品為例,聊聊 UiAutomator2 的使用?
1、連接設(shè)備
使用 UiAutomator2 連接設(shè)備有?3?種方式,分別是:
局域網(wǎng)設(shè)備 IP 地址
USB 連接 +?設(shè)備序列號
ADB?+ IP + 端口號
import?uiautomator2?as?u2
#?方式一:局域網(wǎng)設(shè)備ip地址
device?=?u2.connect(手機ip地址)
#?方式二:USB +?設(shè)備序列號
device?=?u2.connect(手機序列號)
#?方式三:ADB+
#?首先,設(shè)備用USB線連接PC,輸入命令:adb tcpip 端口號進行映射
#?拔掉USB線,通過ip地址+端口號進行連接
device?=?u2.connect_adb_wifi(手機ip地址:端口號)2、打開閑魚 APP
調(diào)用上面?device 對象中?app_start()?方法,傳入應用的包名作為參數(shù)可以打開應用
需要注意的是,方法中的第二個參數(shù)如果傳入 True,可以冷啟動 App,默認值為 False
#?打開應用
device.app_start(PACKAGE_NAME,?stop=True)
3、點擊搜索欄進入搜索界面

首先,全局設(shè)置一個隱式等待,保證查找元素的時候避免因為卡頓、網(wǎng)絡(luò)導致的異常
#?隱式等待20s,保證控件加載完成
device.implicitly_wait(20)然后,通過?WEditor?定位到搜索入口控件的基本信息

常用的?UiAutomator2 定位方式有?6?種,分別是:
ID 定位
Text 文本定位
Description 定位
ClassName 定位
Xpath 定位
組合定位
例如:
#?常用的6種定位方式
#?方式一:ID定位
d(resourceId=元素ID).click()
#?方式二:Text文本定位
d(text="公眾號:AirPython").click()
#?方式三:Description值定位
d(description="AirPython").click()
#?方式四:ClassName定位
d(className="android.widget.TextView").click()
#?方式五:Xpath定位
d.xpath("http://*[@content-desc='AirPython']")
#?方式六:組合定位
d(className="android.widget.ListView",?resourceId=元素ID)
需要指出的是,當界面屬性值不唯一的時候,組合定位就顯得很實用
本例直接使用 ID 去找到元素,然后執(zhí)行點擊操作,跳轉(zhuǎn)到搜索界面
#?點擊到搜索頁面
device(resourceId="com.taobao.idlefish:id/search_bg_img_front",).click()4、搜索
UiAutomator2 中提供了?send_keys()?方法,用于向輸入框中設(shè)置文本
注意:參數(shù) clear 如果設(shè)置為 True,則在輸入內(nèi)容之前,會先清空輸入框,默認值為 False
#?輸入內(nèi)容
device.send_keys("Python",?clear=True)
#?點擊搜索按鈕
device(text="搜索").click()
5、滑動
UiAutomator2 提供了兩個方法用于滑動界面,分別是:
swipe_ext( 滑動方向 )
swipe( 開始 x 軸,開始 y 軸,結(jié)束 x 軸,結(jié)束 y 軸值,滑動時間 )
經(jīng)過測試發(fā)現(xiàn),滑動操作,swipe_ext() 使用效果不穩(wěn)定,建議使用 swipe() 函數(shù)
for?i?in?range(5):
????print('滑動一次')
????swipe_custom(device,?0.5,?0.8,?0.5,?0.2,?1.2)另外,為了保證兼容不同分辨率的設(shè)備,建議通過屏幕百分比自定義滑動方法
def?swipe_custom(device,?start_x_percent,?start_y_percent,?end_x_percent,?end_y_percent,?during=1.0,?interval=1):
????"""
????自定義滑動,適配性更高
????:param?device:
????:param?start_x_percent:
????:param?start_y_percent:
????:param?end_x_percent:
????:param?end_y_percent:
????:param?during:
????:return:
????"""
????#?獲取屏幕的寬、高度
????width,?height?=?device.window_size()
????device.swipe(start_x_percent?*?width,?start_y_percent?*?height,?end_x_percent?*?width,?end_y_percent?*?height,
?????????????????during)
????if?interval?>?0:
????????sleep(interval)
6、關(guān)閉應用
在完成自動化操作后,就可以調(diào)用?app_stop()?方法強制關(guān)閉應用
#?停止App
device.app_stop(PACKAGE_NAME)當然,可以在每次操作完,使用 UiAutomator2 提供的方法?app_clear()?清除 App 數(shù)據(jù)
#?清除App數(shù)據(jù)
#?device.app_clear(PACKAGE_NAME)5.最后
通過上面的實例,我們發(fā)現(xiàn)?UiAutomator2 相比 Appium,語法更簡潔易懂,代碼量也少了很多
但是由于 Uiautomator2 僅適用于 Android 端,Appium 擁有多語言、跨平臺的特性,企業(yè)級自動化一般會選擇后者
我已經(jīng)將文中全部源碼上傳到后臺,關(guān)注公眾號后回復「?uiauto2?」即可獲得全部源碼
如果你覺得文章還不錯,請大家?點贊、分享、留言?下,因為這將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強動力!
