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