App 自動化,Appium 憑什么使用 UiAutomator2?


image

1. UiAutomator2 是什么

可能很多人對 UiAutomator2 和 UiAutomator 傻傻分不清楚

UiAutomator 是 Google 開發的一款運行在 Android 設備上的 UI 自動化測試工具,基於JAVA語言,使用它有一個限制,就是必須打包成 APK 或 JAR,然后上傳到設備,才能運行

事實上,UiAutomator2 同樣有 JAVA和 Python 版,今天我們聊的是 Python 版本的 UiAutomator2

至於 JAVA 版本的可以參考之前寫的文章:點我查看

Python 版本的 UiAutomator2 項目地址:

https://github.com/openatx/uiautomator2

2.Appium 和 UiAutomator2

作為移動端自動化的鼻祖,早期版本的 Appium 是基於 UiAutomator 和 Bootstrap.jar

其中,Bootstrap 在 Appium初始化的時候,被推送到 Android 設備上,負責監聽 Appium 發過來的請求,並轉換后發送給 UiAutomator 去處理,完成自動化操作

最新版本的 Appium 加入了對 UiAutomator2 的支持,原理進行了更新,功能和穩定性更加完善

原理圖可以參考:

image

3.准備

在使用 UiAutomator2 之前,需要做如下准備

1、在 PC 端配置 Android 開發環境

2、使用 pip 安裝 uiautomator2 依賴

# 安裝依賴
pip3 install -U uiautomator2

# 如果需要截屏,需要安裝pillow
pip3 install pillow

3、在手機上安裝 atx-agent 應用

ps:atx-agent 作為服務端,一直運行在后台

# 安裝apk服務到手機上
python -m uiautomator2 init

4、安裝 weditor

WEditor 通過 ip 連接手機,即可以實時查看 App 的界面元素信息

和 Appium DeskTop 類似,可以模擬點擊、滑動操作、生成操作源碼等功能

首先,通過 pip 安裝 weditor 依賴包

# 基於瀏覽器查看 App 的界面元素
pip3 install -U weditor

然后,在命令行輸入 weditor,會自動在瀏覽器中打開,接着通過 ip 連接對應的設備,即可以獲取設備端當前界面的控件信息

信息內容包含:控件的層級關系、控件 ID、文本內容、坐標值等內容

image

4.實戰一下

還是以閑魚搜索商品為例,聊聊 UiAutomator2 的使用

1、連接設備

使用 UiAutomator2 連接設備有 3 種方式,分別是:

  • 局域網設備 IP 地址

  • USB 連接 + 設備序列號

  • ADB + IP + 端口號

import uiautomator2 as u2

# 方式一:局域網設備ip地址
device = u2.connect(手機ip地址)

# 方式二:USB + 設備序列號
device = u2.connect(手機序列號)

# 方式三:ADB+
# 首先,設備用USB線連接PC,輸入命令:adb tcpip 端口號進行映射
# 拔掉USB線,通過ip地址+端口號進行連接
device = u2.connect_adb_wifi(手機ip地址:端口號)

2、打開閑魚 APP

調用上面 device 對象中 app_start() 方法,傳入應用的包名作為參數可以打開應用

需要注意的是,方法中的第二個參數如果傳入 True,可以冷啟動 App,默認值為 False

# 打開應用
device.app_start(PACKAGE_NAME, stop=True)

3、點擊搜索欄進入搜索界面

image

首先,全局設置一個隱式等待,保證查找元素的時候避免因為卡頓、網絡導致的異常

# 隱式等待20s,保證控件加載完成
device.implicitly_wait(20)

然后,通過 WEditor 定位到搜索入口控件的基本信息

image

常用的 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("//*[@content-desc='AirPython']")

# 方式六:組合定位
d(className="android.widget.ListView", resourceId=元素ID)

需要指出的是,當界面屬性值不唯一的時候,組合定位就顯得很實用

本例直接使用 ID 去找到元素,然后執行點擊操作,跳轉到搜索界面

# 點擊到搜索頁面
device(resourceId="com.taobao.idlefish:id/search_bg_img_front",).click()

4、搜索

UiAutomator2 中提供了 send_keys() 方法,用於向輸入框中設置文本

注意:參數 clear 如果設置為 True,則在輸入內容之前,會先清空輸入框,默認值為 False

# 輸入內容
device.send_keys("Python", clear=True)

# 點擊搜索按鈕
device(text="搜索").click()

5、滑動

UiAutomator2 提供了兩個方法用於滑動界面,分別是:

  • swipe_ext( 滑動方向 )

  • swipe( 開始 x 軸,開始 y 軸,結束 x 軸,結束 y 軸值,滑動時間 )

經過測試發現,滑動操作,swipe_ext() 使用效果不穩定,建議使用 swipe() 函數

for i in range(5):
    print('滑動一次')
    swipe_custom(device, 0.5, 0.8, 0.5, 0.2, 1.2)

另外,為了保證兼容不同分辨率的設備,建議通過屏幕百分比自定義滑動方法

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、關閉應用

在完成自動化操作后,就可以調用 app_stop() 方法強制關閉應用

# 停止App
device.app_stop(PACKAGE_NAME)

當然,可以在每次操作完,使用 UiAutomator2 提供的方法 app_clear() 清除 App 數據

# 清除App數據
# device.app_clear(PACKAGE_NAME)

5.最后

通過上面的實例,我們發現 UiAutomator2 相比 Appium,語法更簡潔易懂,代碼量也少了很多

但是由於 Uiautomator2 僅適用於 Android 端,Appium 擁有多語言、跨平台的特性,企業級自動化一般會選擇后者

我已經將文中全部源碼上傳到后台,關注公眾號「 AirPython 」后回復「 uiauto2 」即可獲得全部源碼

如果你覺得文章還不錯,請大家 點贊、分享、留言下,因為這將是我持續輸出更多優質文章的最強動力!

推薦閱讀

帶你用 Python 實現自動化群控(入門篇)

聊聊 Python 做微信小程序自動化,那些踩過的坑?

Python 自動化,Helium 憑什么取代 Selenium?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM