前言
要想深入地掌握任何一門測試工具腾啥,對工具本身的架構冯吓、原理、使用的協(xié)議及相關知識點都必須要有相關的了解和認識凸舵,才能做到靈活使用失尖。更重要的是,一旦出了問題菇夸,解決問題的時候才會有思路仪吧,大概能夠知道問題出在什么地方,再去針對性地調(diào)試和解決摄咆。所以人断,其實任何工具單純使用都不是很難,你和高手之間就只隔著九個字——“知其然恶迈,且知其所以然”。
好了步做,言歸正傳,在本篇我們來先聊聊關于Appium的原理有關的topic煮剧。那么我們在討論Appium的原理時将鸵,究竟在說些什么呢?其實離不開以下幾點:
△ Appium的架構
△ Appium中非常重要的協(xié)議-JSON wire protocol?
△ Appium的中的session機制?
△ Appium的必要配置(desired capabilities)
△ Appium的Server以及客戶端的相關庫
接下來我們一個一個地介紹草娜。
一痒筒、Appium的架構
Appium的本質(zhì)是什么呢?熟悉Selenium?webdriver的人可以把Appium看作是一個基于移動平臺的webdriver移袍。它跟selenium webdriver一樣老充,也是基于HTTP協(xié)議、并用Node.js封裝的一個移動平臺測試框架,只不過它是專門用于移動平臺的測試而已路狮。它處理HTTP請求的方式與Selenium Webdriver一樣,即由server端接收客戶端發(fā)送過來的遵循JSON協(xié)議的HTTP請求涂籽,并按照實際測試的平臺來調(diào)用平臺自身的測試組件來處理這些請求砸抛,以達到跨平臺測試的效果。
下面我們利用android平臺的處理過程來給大家舉個栗子景东。
在android平臺使用appium來進行測試時奔誓,如果android API是大于或等于17的,則其底層是調(diào)用的Uiautomator測試框架和措,而UIautomator則是android平臺自帶的UI測試框架,所以穩(wěn)定性诬留、兼容性啥的都還不錯贫母。當API低于17時,由于不支持Uiautomator颁独,則是調(diào)用的selendroid測試框架來完成誓酒,具體架構及請求處理過程如下圖所示:
由圖上可以看出來,當我們運行我們所寫好的Appium測試腳本時寨辩,Appium會將相應的測試命令以JSON的形式發(fā)送給Appium server歼冰,而Appium server則會根據(jù)被測平臺android API的版本來調(diào)用不同的測試組件(低于17調(diào)selendroid,大于或等于17調(diào)UIautomator)甸怕。在這里腮恩,還有一個比較重要的角色,即bootstrap.jar秸滴,這個jar包可以理解為放在手機端的一個TCP服務器荡含,它的主要作用是消息的傳遞和測試組件調(diào)度。它以jar包形式存在释液,并與UIautomator或selendroid進行通信误债,確保PC端傳入的命令可以在手機端正確執(zhí)行(后面會有專門的部分來分析這個bootstrap的源碼符衔,從而搞清楚它的運行機制糟袁,在這里大家先了解一下)。
上面是對Appium運行機制的基本介紹形帮,我們再來看看Appium的加載流程:
1.調(diào)用android adb完成基本的系統(tǒng)操作和初始化事件
2.在android上部署bootstrap.jar包并啟動
3. Forward(分發(fā))android的端口到PC機周叮,方便測試命令的傳輸
4. PC端監(jiān)聽端口接收請求,并使用JSON wire protocol協(xié)議來解析
5.把解析好的命令通過forward的端口發(fā)給bootstrap.jar
6.由bootstrap.jar最終在手機端調(diào)用Uiautomator或selendroid完成實際的具體測試操作
二合冀、關于JSON wire?protocol
JSON wire protocol(又名基于JSON的有線傳輸協(xié)議)项贺,它是由webdriver開發(fā)者發(fā)明的一種傳輸協(xié)議,現(xiàn)在基本已經(jīng)成為一個標準的W3C標準了棕叫。Appium的核心就是一個遵守REST設計風格的web服務器奕删,它接受客戶端的連接,接收客戶端的命令伏钠,在手機設備上執(zhí)行命令谨设,然后通過HTTP的響應收集命令執(zhí)行的結果。這種架構給我們提供了很好的開放特性:只要某種語言有http客戶端的api,我們就可以通過這個語言寫我們的測試代碼华畏。最初webdriver以及它所依賴的JSON WP的目標是通過調(diào)用Firefox driver亡笑、IE driver等調(diào)用瀏覽器的內(nèi)核相關API,完成web頁面的測試百拓。
Appium在傳統(tǒng)的JSON WP的基礎上,實現(xiàn)了移動端的Mobile JSON WP衙传,它是selenium JSON WP的擴展,也主要面向移動端做了大量的優(yōu)化地回,除了常規(guī)的app中的元素識別俊鱼、對象操作外并闲,還包括安裝、卸載app等帝火,都可以做到购公,這是其他常見的移動測試工具所不具備的能力。
下面我們列舉一些在Appium中使用的宏浩,且基于標準RESTful API的接口例子:
/session/:sessionId
/session/:sessionId/element
/session/:/sessionId/elements
……
當然還有很多其他的接口比庄,Appium提供的客戶端庫則具備調(diào)用這些REST API的能力。比如AppiumDriver.getPageSourece();當你在appium中調(diào)用這個方法的時候佳窑,appium會發(fā)出一個HTTP請求到Appiumserver神凑,調(diào)用具有相應方法的API的端點(endpoint),這個API會調(diào)用像下面這個RESTful API接口來進行處理:
/session/:sessionId/source
PC端的客戶端組件會通過測試腳本向Appium?Server發(fā)送一個JSON格式的請求鹃唯,Appium server通過調(diào)用上面這個API接口地址來獲得頁面源碼瓣喊。當被測應用是個基于web網(wǎng)頁的應用時,它會將頁面的源碼以字符串格式進行返回洪橘。而如果當被測應用是個原生app時,Appium server將會最終以XML文件格式返回被測應用的UI層級視圖熄求。具體的返回響應文本格式根據(jù)被測平臺和應用也有很大的區(qū)別抡四。
三、Appium會話
每一次當Appium server成功啟動后淑履,客戶端的測試庫(client library)會要求與Server創(chuàng)建一個會話(session)藻雪。會話的作用是為了確保能區(qū)別不同的客戶端請求與不同的被測應用,每個特定的會話都有一個特定的sessionId參數(shù)指煎。每次測試開始時便斥,客戶端將初始化一個session會話,雖然不同的語言初始化的方式不同像街,但是他們都要發(fā)送POST/session請求到服務器端晋渺,這些請求里面都會帶有一個對象:desired capabilities ,這個時候服務器端會啟動自動化session然后返回一個session ID,以后的命令都會用這個seesion ID去匹配畴栖。
四八千、關于desired capabilities
desired capabilities是一個JSON對象,由一系列的鍵值對組成照皆,里面包含了各種各樣的信息鸠信。發(fā)送到服務器端后论寨,server解析這些信息就知道了客戶端對哪種session感興趣,然后就會啟動相應的session绰垂。這里面的信息會影響著服務器端啟動session的類型。比如你platformName的值為ios,就是告訴服務器啟動一個ios的session胧沫,而不是android seesion占业。如果safariAllowPopups的值為true,這是告訴safari類的自動化session谦疾,可以使用js打開新窗口。具體信息查看capabilities doc詳細了解念恍,后面我們用一篇來介紹常見desired capabilities的作用峰伙。
五、Appium的Server以及客戶端的相關庫
Appium server是PC端與不同的移動端系統(tǒng)(ios策彤,android)進行交互的主要服務器顿膨,之前所說的每個客戶端在建立測試時所需要的session會話就是由server建立的。它的本質(zhì)是一個HTTP服務器必搞,由node.js編寫而成囊咏,并使用了跟selenium server相同的一些理念(如基于REST風格的API設計、JSON WP)霜第。它負責識別來自客戶端的HTTP請求并將這些請求發(fā)送給不同的平臺户辞。我們可以通過下載源碼進行編譯或直接通過NPM進行安裝的方式來運行Appium server,同時也可以安裝并運行它的GUI版本刃榨。appium server的官方下載網(wǎng)址是http://appium.io。
Appium另一個非常大的優(yōu)勢是由于它的核心庫API是基于REST規(guī)范開發(fā)的桌吃,所以無論什么語言苞轿,只要其支持發(fā)送HTTP請求,都可以用來編寫測試代碼并與之進行交互瑟俭,減少了大家學習某種特定語言的成本契邀。目前使用比較廣泛的語言包括Java、python椭迎、C#田盈、ruby等。并且Appium擴展了傳統(tǒng)的基于web的webdriver的客戶端測試庫简软,并專門針對移動設備測試提供了特定的測試命令接口述暂,例如移動設備上多點觸摸畦韭、手勢操作等,正是由于其做了這些專門的擴展察郁,所以我們在使用appium來做移動端的自動化測試的時候转唉,需要下載其專用的客戶端測試庫來代替?zhèn)鹘y(tǒng)的web driver所使用的測試庫。
主要參考資料:由PACKT出版的《Appium Essential》一書麦轰,但部分內(nèi)容根據(jù)實際情況本文作者有增刪。