1. 程式人生 > 其它 >Windows上實現iOS APP自動化測試:tidevice + WDA + facebook-wda / appium

Windows上實現iOS APP自動化測試:tidevice + WDA + facebook-wda / appium

本文介紹如何在Windows下構建iOS APP自動化測試環境,採用的主要工具為tidevice,WebDriverAgent,facebook-wda或者appium。

目錄

測試架構介紹

下面是本文搭建的iOS自動化測試架構原理圖:

  1. 手機端的WDA Runner(WebDriverAgent)類似於appium測試框架中的 UIAutomator Server,將從客戶端接收到的控制命令轉換為XCUITest 相關API操作,實現對應用介面的控制。WebDriverAgent應用需要通過xcode編譯安裝。
  2. usbmuxd是蘋果提供的一個服務,用於USB和TCP協議之間的轉換,實現在沒有網路的情況下也可以連線裝置,iTunes和Xcode就使用到了這個服務,所以在環境安裝中需要在windows上安裝一個iTunes。
  3. WDA的啟動使用阿里開源的tidevice工具。
  4. Language Bindings為不同語言的測試指令碼,比如基於python語言的facebook-wda,基於go語言的gwda等。

WebDriverAgent原理分析

WebDriverAgent是Facebook 在2015年的 SeleniumConf 大會上推出了一款iOS移動測試框架。它在 iOS 端實現了一個 WebDriver server ,通過這個 server 來實現遠端控制 iOS 裝置。它主要通過連線XCTest.framework來呼叫Apple的API實現對裝置的操作。

WebDriverAgent採用C/S架構,整合appium使用的WebDriver協議規範,通訊協議使用Mobile JSON Wire Protocol。

  1. WDAClient:WDA的客戶端,測試庫facebook-wda 就是 WDA 的 Python 客戶端庫,通過HTTP協議(Mobile JSON Wire Protocol)與WebDriverAgent進行通訊。
  2. WebDriverAgentRunner:執行在手機上的WDA server,預設監聽埠為8100,主要功能包括①接收WDAClient的請求並將操作命令傳送給XCTest.framework。②將響應傳送給WDA Client

tidevice原理分析

前面介紹了iOS的自動化需要通過WebDriverAgent來實現,一種常見的解決方案是使用xcodebuild來啟動WebDriverAgent,而xcode需要Mac系統,也就是必須在MAC上進行iOS自動化測試。

tidevice 是阿里開源的一個基於Python的iOS自動化工具,通過逆向iOS通訊協議,模擬xcodebuild與手機進行通訊,向手機發送特定的指令,來啟動WDA,從而可以脫離Mac電腦,能夠在Linux、Windows上執行iOS自動化。tidevice基於python實現了libimobiledevice中的功能。

tidevice通過usbmuxd與手機通訊來啟動WDA,通過建立一個TCP連線到usbmuxd的/var/run/usbmuxd TCP埠,然後usbmuxd將請求傳送到USB連線的iPhone上。上面提到的libimobiledevice就是一個跨平臺的用於與iOS裝置進行通訊的庫。

iOS 裝置安裝 wda

本文所用的環境:

  • macOS版本:macOS Big Sur 11.4

  • Xcode版本:Version 12.5.1 (12E507)

  • iOS 裝置: iPhone12 mini(14.6)

  • Windows系統版本:Windows 10 家庭中文版

1、安裝Xcode

app store 下載安裝iOS開發環境Xcode。

2、下載WebDriverAgent

使用appium維護的WebDriverAgent,專案地址:https://github.com/appium/WebDriverAgent。

$ git clone https://github.com/appium/WebDriverAgent.git

現在不需要執行下面的指令碼了,作者已經刪除:

$ ./Scripts/bootstrap.sh

3、Xcode開啟WebDriverAgent

雙擊WebDriverAgent中的WebDriverAgent.xcodeproj檔案,這是一個xcode專案檔案。

4、Xcode新增開發者帳戶

Xcode -> Preference

5、專案配置

設定Team為你新增的帳戶,修改Bundle Identifier為唯一名稱

設定完成後,選擇Scheme為WebDriverAgentRunner

選擇Destination為你連線的iPhone。

6、專案構建及測試

然後點選左上角的三角符號進行build,或者點選Product -> Build;

Build成功之後,點選Product -> Test;

可以看到WebDriverAgent安裝到了你的iPhone上

點選iPhone上的設定-> 通用 -> 裝置管理 信任開發者APP

以上是我的WDA安裝配置過程,如果有問題可以參考文件:https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md

安裝iTunes

因為iTunes裡面有usbmux驅動,需要安裝一下它。

下載安裝Windows 版 iTunes方法:https://support.apple.com/zh-cn/HT210384

iTunes安裝成功後,連線上你的iPhone:

安裝tidevice

tidevice用於啟動WDA,它可以執行在Windows上,也支援Mac和Linux。專案地址:https://github.com/alibaba/taobao-iphone-device。 要求Python版本3.6+。

pip安裝tidevice:

$ pip3 install -U "tidevice[openssl]"

檢視是否安裝成功:

$ tidevice version
tidevice version 0.4.14

列出連線裝置

$ tidevice list
List of apple devices attached
00008101-000255021E08001E iPhone11
$ tidevice list --json
[
    {
        "udid": "00008101-000255021E08001E",
        "name": "iPhone11"
    }
]

檢視裝置資訊

$ tidevice info

tidevice的更多使用方法可參考https://github.com/alibaba/taobao-iphone-device#readme

啟動WDA

檢視安裝的WDA應用:

$ tidevice applist
com.apple.store.Jolly Apple Store 509000
com.apple.Keynote Keynote 講演 10.1
com.facebook.WebDriverAgent.XXXXXtest.xctrunner WebDriverAgentRunner-Runner 1.0
com.apple.Numbers Numbers 表格 10.1
com.apple.iMovie iMovie 剪輯 229
com.apple.mobilegarageband 庫樂隊 2.3.8
com.apple.clips 可立拍 2.1.1
com.apple.Pages Pages 文稿 10.1

使用tidevice啟動WDA

$ tidevice -u [裝置 udid] wdaproxy -B [wda 的 bundle Id] --port 8100 # 執行 XCTest 並在PC上監聽8100埠
  • UDID( Unique Device Identifier)是iOS裝置的唯一識別碼,可以通過xcode中檢視,也可以使用上面介紹的tidevice list命令。
  • Bundle ID(Bundle identifier)為應用 ID,是iOS應用的唯一標識。是你編譯WDA應用設定的名稱,可通過tidevice applist命令檢視。
  • 手機裝置中 wda 的預設監聽埠為8100,此命令將手機的8100埠對映到了PC上的8100埠。
  • tidevice xctest --debug:可用於檢視詳細日誌

瀏覽器訪問http://127.0.0.1:8100/status 可以看到手機的狀態資訊。

{
  "value" : {
    "message" : "WebDriverAgent is ready to accept commands",
    "state" : "success",
    "os" : {
      "testmanagerdVersion" : 28,
      "name" : "iOS",
      "sdkVersion" : "14.5",
      "version" : "14.6"
    },
    "ios" : {
      "ip" : "192.168.102.47"
    },
    "ready" : true,
    "build" : {
      "time" : "Jul 17 2021 18:57:32",
      "productBundleIdentifier" : "com.facebook.WebDriverAgentRunner"
    }
  },
  "sessionId" : "EAB73269-5D5B-45EB-913B-2BAA21FE2830"
}

測試一下用tidevice開啟iPhone的【設定】:

$ tidevice launch com.apple.Preferences

其中【設定】的Bundle ID可通過如下命令檢視:

$ tidevice ps
$ tidevice ps --json

appium自動化(未成功)

參考:https://testerhome.com/topics/29230

安裝appium:https://github.com/appium/appium-desktop/releases。 我安裝的版本是1.21.0

安裝完成後啟動Appium

配置資訊:

{
  "platformName": "ios",
  "platformVersion": "14.6",
  "deviceName": "iPhone11",
  "udid": "00008101-000255021E08001E",
  "bundleId": "com.facebook.WebDriverAgent.XXXXXtest.xctrunner",
  "webDriverAgentUrl": "http://127.0.0.1:8100",
  "noReset": true,
  "usePrebuiltWDA": false,
  "useXctestrunFile": false,
  "skipLogCapture": true,
  "automationName": "XCUITest"
}

配置完成後點選【Start Session】,發現連不上,檢視日誌報如下錯誤資訊:

WDA is not response in 30 second, check again after 1s

在issue裡面也有人遇到這個報錯,他們是概率性的,我失敗的概率是100%,完全連不上,折騰一會,還是沒解決,果斷放棄(後面解決了再更新上來),懷疑是我的WDA安裝有問題,但嘗試使用facebook-wda進行自動化測試,發現是OK的,遂再次放棄appium。

facebook-wda自動化

facebook-wda基於python語言,沒有像appium那樣啟動一箇中間服務appium server,這也是appium支援多語言的原因。facebook-wda相比appium更加簡潔,功能也比較多,appium有的功能基本都提供了。

facebook-wda專案地址:https://github.com/openatx/facebook-wda

安裝:

pip3 install -U facebook-wda

測試:

import wda

c = wda.Client('http://localhost:8100') # 8100為啟動WDA設定的埠號
# c.app_current() # 顯示當前應用資訊,主要用於獲取bundleId,也可以使用tidevice ps 命令
c.session().app_activate("com.apple.Preferences")  # 開啟設定
# c.session().app_terminate("com.apple.Preferences") # 退出設定
c(name="搜尋").set_text("NFC")  # 搜尋 NFC
c(name="NFC").click() # 點選NFC
c(xpath='//Switch').exists # 判斷NFC開關是否存在
c(xpath='//Switch').get().value # 獲取NFC開關狀態

常見問題

1、解決iPhone連上MAC之後會不斷重連的問題:
殺掉usbd:

$ sudo killall -STOP -c usbd

2、xcode編譯WDA時可能遇到沒有指定iOS版本檔案,可以嘗試下載對應版本的支援檔案。(我使用的Xcode 12.5.1 有iOS 14.6)

相應iOS版本支援檔案專案地址:https://github.com/iGhibli/iOS-DeviceSupport/tree/master/DeviceSupport

將下載的檔案放到下面的目錄中:Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

3、wda Build成功,出現Unable to copy symbols from this device錯誤

大概率是xcode版本低了,需要升級一下code。

--THE END--

歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!