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

小猴子jerry發表於2021-08-23

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的安裝和啟動

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

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

更多關於tidevice可參看tidevice

參考及擴充套件閱讀

更多知識可關注公號:CodeMonkeyJerry

相關文章