appium底層實現原理解析

appium原理

轉自  木木L玲 
 


一、什麼是Appium


Appium是一個開源、跨平臺的測試框架,可以用來測試原生及混合的移動端應用。Appium支持IOS、Android及FirefoxOS平臺。Appium使用WebDriver的json wire協議,來驅動Apple系統的UIAutomation庫、Android系統的UIAutomator框架。Appium對IOS系統的支持得益於Dan Cuellar’s對於IOS自動化的研究。Appium也集成了Selendroid,來支持老android版本。

Appium支持Selenium WebDriver支持的所有語言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure,或者Perl語言,更可以使用Selenium WebDriver的Api。Appium支持任何一種測試框架。如果只使用Apple的UIAutomation,我們只能用javascript來編寫測試用例,而且只能用Instruction來運行測試用例。同樣,如果只使用Google的UIAutomation,我們就只能用java來編寫測試用例。Appium實現了真正的跨平臺自動化測試。

appium選擇了client-server的設計模式。只要client能夠發送http請求給server,那麼的話client用什麼語言來實現都是可以的,這就是appium及webdriver如何做到支持多語言的;

二、Appium的工作原理及其相關基本概念
2.1 工作原理


2.1.1 Android

在Android端,appium基於WebDriver協議,利用Bootstrap.jar,最後通過調⽤用UiAutomator的命令,實現App的自動化測試。

UiAutomator測試框架是Android SDK自帶的App UI自動化測試Java庫。

另外由於UiAutomator對H5的支持有限,appium引入了chromedriver以及safaridriver等來實現基於H5的自動化。

appium 在android端工作流

client端也就是我們 test script是我們的webdriver測試腳本。

中間是起的Appium的服務,Appium在服務端起了一個Server(4723端口),跟selenium Webdriver測試框架類似, Appium⽀持標準的WebDriver JSONWireProtocol。在這裏提供它提供了一套REST的接口,Appium Server接收web driver client標準rest請求,解析請求內容,調⽤用對應的框架響應操作。

appium server會把請求轉發給中間件Bootstrap.jar ,它是用java寫的,安裝在手機上.Bootstrap監聽4724端口並接收appium 的命令,最終通過調⽤用UiAutomator的命令來實現。

最後Bootstrap將執行的結果返回給appium server。

appium server再將結果返回給 appium client。

2.1.2 ios

在IOS端,appium同樣使⽤WebDriver的一套協議。

與Android端測試框架不同的是,appium ios封裝了apple的 Instruments框架,主要用了Instrument裏的UI Automation(Apple的⾃自動化測試框架),然後在設備中注⼊入bootstrap.js進⾏行監聽。

appium 在ios端工作流

client端 依然是 test script是我們的webdriver測試腳本。

中間是起的Appium的服務,Appium在服務端起了一個Server(4723端口),跟selenium Webdriver測試框架類似, Appium⽀持標準的WebDriver JSONWireProtocol。在這裏提供它提供了一套REST的接口,Appium Server接收web driver client標準rest請求,解析請求內容,調⽤用對應的框架響應操作。

appium server調用instruments.js 啓動⼀一個socket server,同時分出一個⼦子進程運⾏instruments.app,將bootstrap.js(一個UIAutomation腳本)注⼊入到device⽤於和外界進行交互

最後Bootstrap.js將執行的結果返回給appium server

appium server再將結果返回給 appium client。

所以我們可以看到android與ios區別在於appium 將請求轉發到bootstrap.js或者bootstrap.jar.然後由bootstrap 驅動UIAutomation和UiAutomator去devices上完成具體的動作。

2.2 Client/Server Architecture
appium的核心其實是一個暴露了一系列REST API的server。

這個server的功能其實很簡單:監聽一個端口,然後接收由client發送來的command。翻譯這些command,把這些command轉成移動設備可以理解的形式發送給移動設備,然後移動設備執行完這些command後把執行結果返回給appium server,appium server再把執行結果返回給client。

在這裏client其實就是發起command的設備,一般來說就是我們代碼執行的機器,執行appium測試代碼的機器。狹義點理解,可以把client理解成是代碼,這些代碼可以是java/ruby/python/js的,只要它實現了webdriver標準協議就可以。

這樣的設計思想帶來了一些好處:

可以帶來多語言的支持;

可以把server放在任意機器上,哪怕是雲服務器都可以;(是的,appium和webdriver天生適合雲測試)

2.3 Session
session就是一個會話,在webdriver/appium,你的所有工作永遠都是在session start後纔可以進行的。一般來說,通過POST /session這個URL,然後傳入Desired Capabilities就可以開啓session了。

開啓session後,會返回一個全局唯一的session id,以後幾乎所有的請求都必須帶上這個session id,因爲這個seesion id代表了你所打開的瀏覽器或者是移動設備的模擬器。

進一步思考一下,由於session id是全局唯一,那麼在同一臺機器上啓動多個session就變成了可能,這也就是selenium gird所依賴的具體理論根據。

2.4 Desired Capabilities
Desired Capabilities攜帶了一些配置信息。從本質上講,這個東東是key-value形式的對象。你可以理解成是java裏的map,python裏的字典,ruby裏的hash以及js裏的json對象。實際上Desired Capabilities在傳輸時就是json對象。

Desired Capabilities最重要的作用是告訴server本次測試的上下文。這次是要進行瀏覽器測試還是移動端測試?如果是移動端測試的話是測試android還是ios,如果測試android的話那麼我們要測試哪個app? server的這些疑問Desired Capabilities都必須給予解答,否則server不買賬,自然就無法完成移動app或者是瀏覽器的啓動。

2.5 Appium Server
這就是每次我們在命令行用appium命令打開的東西。

Appium server 是用 Node.js 寫的。我們可以用源碼編譯或者從 NPM 直接安裝。

2.6 Appium 服務端
Appium 服務端有很多語言庫 Java, Ruby, Python, PHP, JavaScript 和 C#,這些庫都實現了 Appium 對 WebDriver 協議的擴展。當使用 Appium 的時候,你只需使用這些庫代替常規的 WebDriver 庫就可以了。 你可以從這裏看到所有的庫的列表。

2.7 Appium Clients
由於原生的webdriver api是爲web端設計的,因此在移動端用起來會有點不倫不類。appium官方提供了一套appium client,涵蓋多種語言ruby/java/python,在我看來ruby client是實現最好的。在測試的時候,一般要使用這些client庫去替換原生的webdriver庫。這實際上不是替換,算是client對原生webdriver進行了一些移動端的擴展,加入了一些方便的方法,比如swipe之類,appium client讓我們可以更方便的寫出可讀性更好的測試用例。

2.8 Appium.app, Appium.exe
官方提供了GUI封裝的Appium服務端下載,它封裝了Appium服務端的所有依賴,用戶不用擔心怎樣安裝Node.js。GUI封裝的Appium中還包括了一個Inspector工具,可以幫助用戶檢查應用的節目層級,雖然Android官方的SDK中的Android Device Monitor和UI Automator Viewer也可以實現,但是相比較Inspector還是有不足之處。

2.9Bootstrap
1)Bootstrap作用:

Bootstrap是Appium運行在安卓目標測試機器上的一個UiAutomator測試腳本,該腳本的唯一一個所做的事情是在目標機器開啓一個socket服務器來把一個session中Appium從PC端過來的命令發送給UiAutomator來執行處理。

它會監聽4724端口獲得命令然後pass給UiAutomator來做處理。

2)Bootstrap在appium中扮演的角色:

首先,Bootstrap是uiautomator的測試腳本,它的入口類bootstrap繼承於UiautomatorTestCase,所以Uiautomator可以正常運行它,它也可以正常使用uiautomator的方法,這個就是appium的命令可以轉換成uiautomator命令的關鍵;

其次,bootstrap是一個socket服務器,專門監聽4724端口過來的appium的連接和命令數據,並把appium的命令轉換成uiautomator的命令來讓uiautomator進行處理;

最後,bootstrap處理的是從pc端過來的命令,而非一個文件!
————————————————
版權聲明:本文爲CSDN博主「木木L玲」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/bisong4665/article/details/81117713

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章