本文介紹如何在Windows下構建iOS APP自動化測試環境,采用的主要工具為tidevice,WebDriverAgent,facebook-wda或者appium。
測試架構介紹
下面是本文搭建的iOS自動化測試架構原理圖:

- 手機端的WDA Runner(WebDriverAgent)類似於appium測試框架中的 UIAutomator Server,將從客戶端接收到的控制命令轉換為XCUITest 相關API操作,實現對應用界面的控制。WebDriverAgent應用需要通過xcode編譯安裝。
- usbmuxd是蘋果提供的一個服務,用於USB和TCP協議之間的轉換,實現在沒有網絡的情況下也可以連接設備,iTunes和Xcode就使用到了這個服務,所以在環境安裝中需要在windows上安裝一個iTunes。
- WDA的啟動使用阿里開源的tidevice工具。
- 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。
- WDAClient:WDA的客戶端,測試庫facebook-wda 就是 WDA 的 Python 客戶端庫,通過HTTP協議(Mobile JSON Wire Protocol)與WebDriverAgent進行通信。
- 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上


以上是我的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。
歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!