做iOS自動化測試必須知道的一些知識

WDA

facebook wda

2015年Facebook 開源了一款 iOS 移動測試框架WebDriverAgent,WebDriverAgent 在 iOS 端實現了一個 WebDriver server ,藉助這個 server 我們可以遠程控制 iOS 設備。你可以啟動、殺死應用,點擊、滾動視圖,或者確定頁面展示是否正確。它通過鏈接 XCTest.framework 並調用蘋果的 API 直接在設備上執行命令。這使得它成為應用程式端到端測試或通用設備自動化的完美工具

wda作為任何UITest的捆綁軟體啟動,WebDriverAgentRunner作為一個後台應用運行在iOS手機上,
ServerURLHere->//[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的安裝和啟動

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

更多參看libimobiledevice Usage

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

  1. tidevice relay,轉發請求到手機,類似於iproxy如tidevice relay 8100 8100
  2. 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
  1. 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

可通過在瀏覽器中訪問//localhost:8200/status來查看WDA是否啟動成功
Linux和Windows因為默認沒有usbmux這個服務,提前安裝一下就可以。可以參考這個issue
啟動後你就可以使用Appium 或者 facebook-wda 來運行iOS自動化了

更多關於tidevice可參看tidevice

參考及擴展閱讀

更多知識可關注公號:CodeMonkeyJerry