前言
在群里看到WebDriverAgent這個東西,出于好奇,便開始百度+谷歌,最終對其有了簡單的了解。也對自動化測試也有了一個初步的了解。接下來你看到的是對WebDriverAgent的一些介紹。
正文
WebDriverAgent簡稱WDA。它是由Facebook推出的一款移動端測試框架。它是在iOS客戶端實現了一個WebDriver的Server,借助這個server,我們可以遠程控制iOS設備進行測試。
它更多的是測試人員進行自動化測試用的,所以在 testerhome 上有一些文章對其進行了介紹。具體的文章鏈接可以參見文末的附錄。
原理
據官方介紹,它是通過鏈接XCTest.framework和調用蘋果的API直接在設備上執行命令。在網上看到一張圖:
先忽略這張圖,我們可以先看一個Xcode自帶的軟件:Accessibility Inspector。直接打開Xcode,然后點擊菜單的Xcode-->Open Developer Tool即可找到該軟件。這個軟件按照名稱來理解的話簡單可以理解為可用性檢查員。通過選擇不同的設備(Mac、Simulator、iPhone),可以對其進行檢查,例如我直接選擇我的mac,然后選擇微信那個進程,你會發現該軟件的首頁是Quicklook,也就是對微信的一個概覽。你可以點擊頁面上的類似瞄準器的按鈕,當你選中之后,顏色會變成藍色,這個時候將鼠標移動到微信界面上,你會發現使用它可以檢查微信mac版本的各個元素,并且可以查看各個元素的屬性,如果該元素具有Actions,你還可以進行點擊操作。也就是說你完全不用直接去操作微信,而直接使用Accessibility Inspector進行操作即可?;诖?,我們可以利用查看的層級結構,進行UI自動化測試。更多的關于Accessibility可以參見iOS Accessibility Tutorial。對這個的理解我現在只停留在對工具的使用,后續會繼續進行學習。
也就是基于Accessibility、XCTest.framework和UIAutomation.framework,才實現了對APP的各種操作,而WDA就是通過在被測設備上安裝了WebDriverAgentRunner,然后通過WDA的一些API進行了服務器和客戶端交互?;贏PI進行編寫業務測試腳本,最后將腳本運行實現自動化測試的過程。
特性
在WDA的Github上也給出了WDA的特性:
1.支持真機 &&模擬器
在模擬器上運行還是比較方便的,在真機上需要進行證書配置、進行端口轉發。這個下面會介紹到。
2.實現了大多數的WebDriver Spec
3.實現了部分Mobile JSON Wire Protocol Spec
如果想進一步了解Mobile JSON Wire Protocol Spec是什么,可以查看附錄的1鏈接
4.支持USB連接設備
USB連接設備的時候,需要代理轉發,這里用到了mobiledevice(或者使用usbmuxd)方法很簡單直接進行端口代理即可(可參見本條特性的外鏈)。
5.提供了一個Inspector,可以很直觀地查看當前設備的狀態以及元素tree。
6.方便上手,它可以直接通過Xcode啟動和調試
7.Unsupported yet,but works with tvOS & OS X
安裝
WDA的安裝很方便,只需要執行下面幾個步驟就搞定(前提是你安裝了各種環境支持,npm,node,carthage等):
第一步:下載工程,下載鏈接點這里。
第二步:在解壓后的工程根目錄執行下面腳本:
./Scripts/bootstrap.h
該操作會通過Carthage安裝所有的依賴、使用npm構建inspector包。
第三步:打開WebDriverAgent.xcodeproj,開啟WebDriverAgentRunner test即可。
使用
選中要執行的設備,按照安裝的第三步執行,即可啟動WDA,執行UITestingUITests,當console輸出如下信息則說明啟動成功:
2018-06-27 15:56:14.352191+0800 WebDriverAgentRunner-Runner[9119:362446] +[CATransaction synchronize] called within transaction
2018-06-27 15:56:14.477644+0800 WebDriverAgentRunner-Runner[9119:362446] Running tests...
objc[9119]: Class VCWeakObjectHolder is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AVConference.framework/Frameworks/ViceroyTrace.framework/ViceroyTrace (0x12bfce4d0) and /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AVConference.framework/AVConference (0x12b0fae38). One of the two will be used. Which one is undefined.
2018-06-27 15:56:16.007610+0800 WebDriverAgentRunner-Runner[9119:362446] Continuing to run tests in the background with task ID 1
Test Suite 'Selected tests' started at 2018-06-27 15:56:16.612
Test Suite 'WebDriverAgentRunner.xctest' started at 2018-06-27 15:56:16.613
Test Suite 'UITestingUITests' started at 2018-06-27 15:56:16.613
Test Case '-[UITestingUITests testRunner]' started.
t = 0.00s Start Test at 2018-06-27 15:56:16.614
t = 0.00s Set Up
2018-06-27 15:56:16.617879+0800 WebDriverAgentRunner-Runner[9119:362446] Built at Jun 26 2018 18:43:04
2018-06-27 15:56:16.708704+0800 WebDriverAgentRunner-Runner[9119:362446] ServerURLHere->http://172.19.156.187:8100<-ServerURLHere
關鍵是最后一句話,顯示了Server 的URL,直接將其拷貝,然后在瀏覽器打開即可。
地址后面添加/status可以查看當前設備(你使用的哪個設備運行,就是哪個設備的狀態)的狀態。
地址后添加/inspector即可打開inspector,查看元素,界面如下:
到這里,你就可以按照WDA提供的API進行腳本編寫了,API地址為https://github.com/facebook/WebDriverAgent/wiki/Queries 。里面有很多命令,按照命令即可編寫shell腳本進行自動化測試。例如從APP中回到主屏幕的操作(相當于點擊了home button):
curl -X POST -H "Content-Type: application/json" -d "" http://localhost:8100/wda/homescreen
可以先看一下API提供的語句:
curl -X GET $JSON_HEADER $DEVICE_URL/status
其中:
$JSON_HEADER代表:' -H "Content-Type: application/json" '
$DEVICE_URL代表剛才的ServerURL。
但是這種方式寫起來比較麻煩,在網上又進行了查找,最終發現了facebook-wda非官方提供,但是很好用,安裝方式也比較簡單,直接執行命令(前提是安裝了python以及pip):
pip install --pre facebook-wda
然后就可以使用python進行腳本編寫:
#coding:utf-8
import wda
driver = wda.Client('http://172.13.156.187:8100')
# setting_session = driver.session('com.apple.Preferences')
# setting_session(text=u'通用',className='Cell').tap()
#點擊home button
driver.home()
這樣寫起來看著就比較方便了。簡單做一個對比:
WDA提供的API操作有很多,直接查看相關文檔即可。另外,當時風靡一時的跳一跳python腳本執行,就是基于WDA進行的。想自己嘗試的可以查看附錄2鏈接。親測可用。有一點需要注意的是在wechat_jump_game項目中,你要把對應的config.json文件拷貝到這個根目錄,這樣wecaht_jump_auto_iOS.py腳本才可以讀到這個配置。
結束語
WDA的使用還有很多方面,網易游戲團隊ATX測試框架進行iOS測試就是使用的WDA,另外比較知名的appium也采用的WDA。有興趣可以對其進行研究學習。
在學習的過程中發現了testerhome這個網站,應該是QA同學比較鐘愛的網站,里面有各種文章以及問答,大多數都是關于測試技術相關,強烈推薦給QA同學。
附錄
1.作為移動測試人員,你應該知道的移動自動化測試協議 Mobile JSON Wire Protocol Specification
2.基于python+WebDriverAgent的跳一跳小程序高分教程
3.iOS測試 WebDriverAgent簡介
4.iOS自動化實踐——WebDriverAgent(一)
5.iOS自動化實踐——WebDriverAgent(二)