比 appium 更簡單的 app 測試工具:uiautomator

1,場景

在 app 測試的蠻荒時代,如果要進行 app 自動化測試非常麻煩。張大胖如果想做安卓自動化測試,首先必須要學 Java。因爲安卓自動化測試都繞不開 google 自己研發的自動化測試框架,於是張大胖哼哧哼哧學了半年 java,開始上手 UiAutomator 做自動化測試。2 周過去了,張大胖開始向王哥抱怨:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-7C1QvLUa-1573271661200)(D:\data\雨澤\typora圖片\1572590086033.png)]

王哥一看他的代碼,demo 都還沒跑起來,再讓他玩下去,公司都倒閉了。於是王哥給張大胖推薦了一個工具叫 appium, 這個工具強就強在跨平臺,跨語言,還開源。張大胖之前學過半個月 python, 搞這個問題應該不大。

過了一天,張大胖果然興沖沖的跑過來,高興的說流程跑通了。appium 這玩意真不錯,就是有一個不好的地方,通過代碼查找 app 上的元素經常要嵌套 java 代碼。 之前被搞怕了,張大胖現在看到 java 就頭大。

王哥又給張大胖推薦了一個工具,這個工具叫 python uiautomator。它可以在手機上裝一個 http rpc 服務,你可以通過其他語言作爲客戶端去遠程調用 uiautomator 的接口。這個庫解決了原始 uiautomator 的 2 個問題:

  • 必須要會 Java 代碼
  • 腳本要傳到設備上才能運行

他的原理圖類似於這樣:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gSZ6n8sV-1573271661202)(D:\data\雨澤\typora圖片\1572590908549.png)]

而相比 appium, 這個工具封裝的 api 更加簡潔,使用起來更加高效。張大胖馬上回去研究了一下,15 分鐘就把流程跑通了,當天就請王哥搓了頓小龍蝦。有了這麼好用的工具,張大胖趕緊回來寫筆記。

2,安裝

安裝不要太簡單,一行命令搞定。相比 appium 要裝的各種依賴,簡直不要太幸福。安裝好以後,連接手機,輸入 adb devices 指令,確認手機連接成功,輕鬆完成。

# 官方下載安裝
pip install automator2

如果官方站點無法訪問,可以訪問豆瓣源下載:
pip install -i https://pypi.doubanio.com/si
mple/ uiautomator2

3,快速使用

手工怎麼測,這個工具的流程完全一樣,省心省力,一行多餘的代碼都沒有。而使用 appium 的時候,張大胖爲了寫長長的 desired capabilities 不知消耗了多少腦細胞。

1, 連接設備;
2, 啓動app;
3, 元素定位;
4,元素操作;
5,關閉 app。

import uiautomator2

# 連接手機
d = uiautomator2.connect()
# 啓動app
d.app_start("com.lemon.lemonban")
# 定位元素
my = d(resourceId='com.lemon.lemonban:id/navigation_my')
# 操作元素
my.click()
# 關閉 app
d.app_stop("com.lemon.lemonban")

相同版本的 appium 代碼,對比了解一下:

from appium.webdriver import Remote

caps = {
    "platformName": "Android",
    "platformVersion": "5.1",
    "deviceName": "Android Emulator",
    # "app": r"D:\Program Files\adt-bundle-windows-x86_64-20140702\sdk\build-tools\28.0.3\Future-release-2018.apk.apk",
    "appActivity": "com.lemon.lemonban.activity.addition.WelcomeActivity",
    "appPackage": "com.lemon.lemonbano",
    "noReset": "False",
}
# 連接手機
driver = Remote(desired_capabilities=caps)
# 定位
my = driver.find_element_by_id('com.lemon.lemonban:id/navigation_my')
my.click()
# 退出
driver.quit()

做一個簡單的對比, python 版的 uiautomator 具有如下優勢:

  • 連接手機的時候可以省去大段信息
  • 元素定位直接採用更加優雅的 __call__() 機制,不需要調函數名稱,而是通過關鍵字參數的形式直接完成元素定位。
  • 將 app 作爲一個管理單元(session),會有更大的靈活性。
  • 這裏還不包括更加靈活的等待和 watcher 機制。

4,使用 weditor 工具查看元素定位

爲了更加方便的進行元素定位,可以使用 weditor 輔助獲取元素定位表達式,如果不想用,也可以用 uiautomatorviewer 等原生安卓輔助工具。

安裝 weditor, 你懂的 pip install weditor。 安裝完成後命令行輸入 weditor 一鍵啓動,直接彈出圖形化界面。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tYMWSA9q-1573271688796)(D:\data\雨澤\typora圖片\1572593040326.png)]

weditor 的優勢在於:

  • 可以同時管理多個設備;
  • 直接在調試界面操作手機,不需要另一隻手去動手機;
  • 自動生成 uiautotor 代碼。

5,總結

本篇介紹了非常簡單的 uiautomator 使用,總結一下它的優勢:

  • 不用會 java, 也可以體驗原生測試的“快”感;
  • api 封裝異常簡單,符合 python 的優雅性格;
  • 上手迅速,略懂 python,就可以玩轉。

不聊了,這麼好用的工具,我要趕緊回去喫透它。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章