WDA
facebook wda
2015年Facebook 開源了一款 iOS 移動測試框架WebDriverAgent,WebDriverAgent 在 iOS 端實現了一個 WebDriver server ,藉助這個 server 我們可以遠端控制 iOS 裝置。你可以啟動、殺死應用,點選、滾動檢視,或者確定頁面展示是否正確。它通過連結 XCTest.framework 並呼叫蘋果的 API 直接在裝置上執行命令。這使得它成為應用程式端到端測試或通用裝置自動化的完美工具
wda作為任何UITest的捆綁軟體啟動,WebDriverAgentRunner作為一個後臺應用執行在iOS手機上,
ServerURLHere->http://[SOME_IP]:8100<-ServerURLHere
即在手機上8100埠啟動一個HTTP server,內部就是一個死迴圈,監聽網路傳輸過來的webdriver協議的資料,解析並處理點選事件
但該專案已經存檔(archived),不再維護。2019年5月,Facebook開源了IDB,即“ iOS Development Bridge”,這是一個用於使iOS模擬器和裝置自動化的命令列介面。他們正在將自己的內部專案從WDA遷移到IDB,並建議將其檢查出來作為替代方案
appium wda
由於facebook wda已經停止維護,現在一般推薦使用fork自 facebook wda的appuim wda
airtest wda
iOS-Tagent也是基於 facebook 的 WebDriverAgent 專案上進行開發的 , 目的是為了對 Airtest Project 提供iOS平臺的測試支援,該專案在原專案的基礎上進行了定製化的優化和功能調整
XCTestWD
XCTestWD是WebDriver server的Swift版本實現,主要用於Macaca自動化專案,這裡不做過多介紹,更多可參考官方文件Macaca面向多端的自動化測試
wda的安裝和啟動
- 安裝:可參考各自官方指南如iOS-Tagent 安裝、iOS 真機如何安裝 WebDriverAgent
- 啟動方式:
- facebook wda啟動方式可參考Starting WebDriverAgent,
Xcode, xcodebuild 或FBSimulatorControl
- appium wda 啟動方式可參考Appium XCUITest Driver Real Device Setup
- facebook wda啟動方式可參考Starting WebDriverAgent,
usbmux、libimobiledevice、usbmuxd及libusbmuxd
- usbmux是蘋果的私有協議,蘋果設計該協議的原因是為了自家的macOS APP能夠和iDevice進行通訊,從而實現諸如iTunes備份iPhone、Xcode真機除錯等功能
- libimobiledevice 是一個使用原生協議與蘋果iOS裝置進行通訊的庫,可以把iPhone埠對映到電腦埠,那麼就可以通過訪問電腦的埠訪問到手機的埠了
- libimobiledevice底層使用的是usbmuxd,usbmuxd(USB multiplexing daemon)是跨平臺的與iOS裝置多路複用連線的scoket守護程式,該程式的作用是建立本地埠和遠端埠的轉發,實現usb到tcp的轉換服務,根據相關usb協議,客戶端將請求包傳送到usbmuxd程式,通過usbmuxd轉發到對方裝置,實現tcp連線。而更底層用的是libusbmuxd,更詳細的可點選檢視專案中的介紹
安裝libimobiledevice
brew install libimobiledevice --HEAD
libimobiledevice常用命令
- 埠轉發:
iproxy xxxx yyyy
(本地xxxx埠到裝置的yyyy埠)
如將本地8100埠對映到裝置埠8100即iproxy 8100 8100
,這樣就可以通過訪問電腦的埠訪問到手機的埠了 - 檢視裝置系統日誌
idevicesyslog
- 檢視連線裝置資訊
ideviceinfo
iOS自動化
綜上,WDA會在iOS 端實現了一個 WebDriver server,並監聽網路傳輸過來的webdriver協議的資料,通過電腦與手機埠的對映,我們就可以通過電腦傳送網路請求到手機上的server,server就能解析並處理點選事件了
tidevice
因此我們需要做的是安裝並啟動WDA,設定埠轉發。在tidevice出現之前,WDA只能通過xcodebuild來啟動,而執行xcodebuild則必須有一臺Mac才行。tidevice沒有通過xcodebuild,而是通過usbmuxd直接跟手機上的服務進行直接通訊完成手機上WDA的啟動。usbmux在不同的平臺都有開源的實現,所以tidevice不僅能在Mac上執行,也能在Linux、Windows上執行
-
安裝WDA
方法1:(必須mac)將iOS裝置與一臺Mac連線,然後使用xcode編譯原始碼安裝,成功安裝WebDriverAgent即可脫離Mac
方法2:使用tidevice的安裝命令,將開發者證書重簽名的WebDriverAgent.ipa
安裝到iOS裝置上 -
執行WDA
- tidevice relay,轉發請求到手機,類似於iproxy如
tidevice relay 8100 8100
- tidevice xctest,執行xctest
# 執行XCTEST
$ tidevice xctest -B com.facebook.wda.WebDriverAgent.Runner
[I 210127 11:40:23 _device:909] BundleID: com.facebook.wda.WebDriverAgent.Runner
[I 210127 11:40:23 _device:911] DeviceIdentifier: 12345678901234567890abcdefg
[I 210127 11:40:23 _device:773] SignIdentity: 'Apple Development: -Your-Developer-Name-'
[I 210127 11:40:23 _device:840] Launch 'com.facebook.wda.WebDriverAgent.Runner' pid: 239
[I 210127 11:40:23 _device:1003] ProductVersion: 12.4
[I 210127 11:40:24 _device:952] Start execute test plan with IDE version: 29
[I 210127 11:40:24 _device:875] WebDriverAgent start successfully
# 修改監聽埠為8200, 並顯示除錯日誌
$ tidevice xctest -B com.facebook.wda.WebDriverAgent.Runner -e USB_PORT:8200 --debug
- tidevice wdaproxy命令,wdaproxy這個命令會同時呼叫xctest和relay命令,另外當wda退出時,會自動重新啟動xctest
# 可通過tidevice applist來獲取wda的BundleID
# 執行 XCTest 並在PC上監聽8200埠轉發到手機8100服務
# facebook-wda
$ tidevice wdaproxy -B com.facebook.wda.WebDriverAgent.Runner --port 8200
# appium的wda
$ tidevice wdaproxy -B com.gameappium.WebDriverAgentRunner.xctrunner --port 8200
可通過在瀏覽器中訪問
http://localhost:8200/status
來檢視WDA是否啟動成功
Linux和Windows因為預設沒有usbmux這個服務,提前安裝一下就可以。可以參考這個issue
啟動後你就可以使用Appium 或者 facebook-wda 來執行iOS自動化了
更多關於tidevice可參看tidevice
參考及擴充套件閱讀
更多知識可關注公號:CodeMonkeyJerry