Windows上實現iOS APP自動化測試:tidevice + WDA + facebook-wda / appium
本文介紹如何在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上
點選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。
歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!