讀懂a(chǎn)ppium原理,看這篇就夠了

話不多說(shuō),直接上干貨:

整體流程圖

appium的整體架構(gòu)是C/S模式,整體流程(返回順序?yàn)槟嫦颍?/p>

腳本請(qǐng)求 ——> 4723端口appium server ——> 解析參數(shù)給PC端4724端口 ——> 發(fā)送給設(shè)備4724端口 ——>?通過(guò)設(shè)備4724端口發(fā)給bootstrap.jar ——>?Bootstrap.jar把命令發(fā)給uiautomator

1、腳本請(qǐng)求 ——> 4723端口appium server :

首先我們要開啟appium服務(wù),即Appium server,也就是在命令行用appium命令打開的東西,默認(rèn)監(jiān)聽4723端口。4723端口專門和腳本打交道,基于WebDriver協(xié)議。webdriver是按照server – client的經(jīng)典設(shè)計(jì)模式設(shè)計(jì)的,作用就是啟動(dòng)基于WebDriver Wire協(xié)議的appium服務(wù),接下來(lái)腳本與appium server的通信實(shí)際上是一個(gè)HTTP request請(qǐng)求給appium server,在請(qǐng)求的body中,會(huì)以WebDriver Wire協(xié)議規(guī)定的JSON格式的字符串來(lái)告訴appium服務(wù)我們希望設(shè)備接下來(lái)做什么事情。讀到這里,難免有同學(xué)會(huì)有疑問(wèn)了,因?yàn)橛幸恍┪臋n上面說(shuō)腳本發(fā)送請(qǐng)求是基于Json wire protocol協(xié)議的,首先這是完全正確的,接下來(lái)就解釋一下:

appium中的Json wire protocol繼承自selenium的webdriver wire protocol,并進(jìn)行了擴(kuò)展,使得Json wire protocol能夠控制不同的移動(dòng)設(shè)備的行為。如果大家覺(jué)得對(duì)于webdriver這個(gè)名詞覺(jué)得比較陌生的話,接下來(lái)說(shuō)一個(gè)詞肯定熟悉 -?Selenium。Selenium是一個(gè)瀏覽器自動(dòng)化操作框架。Selenium主要由三種工具組成。第一個(gè)工具SeleniumIDE,是Firefox的擴(kuò)展插件,支持用戶錄制和回訪測(cè)試,錄制/回訪模式存在局限性,對(duì)許多用戶來(lái)說(shuō)并不適合,因此第二個(gè)工具——Selenium WebDriver提供了各種語(yǔ)言環(huán)境的API來(lái)支持更多控制權(quán)和編寫符合標(biāo)準(zhǔn)軟件開發(fā)實(shí)踐的應(yīng)用程序。最后一個(gè)工具——SeleniumGrid幫助工程師使用Selenium API控制分布在一系列機(jī)器上的瀏覽器實(shí)例,支持并發(fā)運(yùn)行更多測(cè)試。在項(xiàng)目?jī)?nèi)部,它們分別被稱為“IDE”、“WebDriver”和“Grid”。

那么webdriver wire protocol又是什么呢:

在我們創(chuàng)建一個(gè)WebDriver的過(guò)程中,Selenium首先會(huì)確認(rèn)瀏覽器的native component是否存在可用而且版本匹配。接著就在目標(biāo)瀏覽器里啟動(dòng)一整套Web Service,這套Web Service使用了Selenium自己設(shè)計(jì)定義的協(xié)議,名字叫做The WebDriver Wire Protocol,只不過(guò)對(duì)應(yīng)到我們這里的瀏覽器指的是Appium。

WebDriver Wire協(xié)議是通用的,也就是說(shuō)不管是FirefoxDriver還是ChromeDriver,啟動(dòng)之后都會(huì)在某一個(gè)端口啟動(dòng)基于這套協(xié)議的Web Service。對(duì)應(yīng)到Appium,可以理解為是AppiumDriver。接下來(lái),我們調(diào)用WebDriver的任何API,都需要借助一個(gè)ComandExecutor發(fā)送一個(gè)命令,實(shí)際上是一個(gè)HTTP request給端口上的Web Service。在我們的HTTP request的body中,會(huì)以WebDriver Wire協(xié)議規(guī)定的JSON格式的字符串來(lái)告訴Selenium我們希望瀏覽器(設(shè)備)接下來(lái)做什么事情。

說(shuō)到這里可能會(huì)有疑問(wèn)了,上面說(shuō)到的是腳本請(qǐng)求對(duì)設(shè)備進(jìn)行操作,但前提是,我們要對(duì)誰(shuí)進(jìn)行操作測(cè)試呢?這里就引入一個(gè)新名詞:desiredCapabilities。了解了上述之后,再去看腳本怎么將desiredCapabilities傳遞給appium server就明白多了,腳本通過(guò)Json Wire Protocol協(xié)議以json格式發(fā)送測(cè)試設(shè)備信息給server端,測(cè)試設(shè)備信息被攜帶在Desired Capabilities中,這個(gè)東西實(shí)質(zhì)上是一個(gè)key-value形式的對(duì)象,Desired Capabilities最重要的作用是告訴server本次測(cè)試的上下文。這次是要進(jìn)行瀏覽器測(cè)試還是移動(dòng)端測(cè)試?如果是移動(dòng)端測(cè)試的話是android還是ios?如果android的話我們要測(cè)試哪個(gè)app?server的這些疑問(wèn)Desired Capabilities都必須給予解答,否則server不買賬,針對(duì)我們現(xiàn)在所說(shuō)的安卓,它帶來(lái)的影響就是無(wú)法完成app的啟動(dòng)。

那么,將測(cè)試設(shè)備信息告知之后,是不是就可以開始進(jìn)行測(cè)試了呢?答案是:NO。這里又要引入一個(gè)名詞:session。session就是一個(gè)會(huì)話,在webdriver/appium,你的所有工作永遠(yuǎn)都是在session start后才可以進(jìn)行的。client 創(chuàng)建1個(gè)session,在該session中通過(guò)http向appium server發(fā)送請(qǐng)求,appium server解析請(qǐng)求,完成相應(yīng)操作并返回response。

session

Session在計(jì)算機(jī)中,尤其是在網(wǎng)絡(luò)應(yīng)用中,稱為“會(huì)話控制”。Session 對(duì)象存儲(chǔ)特定用戶會(huì)話所需的屬性及配置信息,對(duì)應(yīng)到這里其實(shí)就是desiredCapabilities中的配置信息參數(shù)。腳本通過(guò)POST /session這個(gè)URL,然后傳入Desired Capabilities就可以開啟session了,由于這是第一次請(qǐng)求創(chuàng)建session,所有并沒(méi)有一個(gè)已創(chuàng)建的session id,所以appium server會(huì)調(diào)用android driver(appium升級(jí)到2.0.0后,原有的AppiumDriver函數(shù)變成抽象函數(shù)了,需更改為AndroidDriver)為client生成一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的session id,這個(gè) session id將被在本次響應(yīng)中返回給客戶端保存,當(dāng)下次腳本發(fā)出操作請(qǐng)求時(shí)就會(huì)自帶session id為唯一標(biāo)識(shí),代表所打開的設(shè)備,Appium server會(huì)按照此session id把這個(gè)session檢索出來(lái)使用,腳本向appium server發(fā)送的請(qǐng)求即是存在于創(chuàng)建的session中的。

Session 的作用就是它在appium服務(wù)上保持設(shè)備的狀態(tài)信息,供在任何時(shí)間進(jìn)行訪問(wèn),在多次的操作行為中,存儲(chǔ)在 Session對(duì)象中的配置信息將不會(huì)丟失,而是在整個(gè)用戶會(huì)話中一直存在下去,整個(gè)測(cè)試進(jìn)程中設(shè)備與程序的聯(lián)系不會(huì)斷開,也不需要每次都發(fā)送帶配置信息的請(qǐng)求,程序都知道對(duì)哪個(gè)設(shè)備進(jìn)行測(cè)試操作。當(dāng)測(cè)試結(jié)束后,需關(guān)閉webdriver,driver.quit()會(huì)關(guān)閉所有關(guān)聯(lián)窗口和session,并且也會(huì)把進(jìn)程也關(guān)閉。

2、解析參數(shù)給PC端4724端口 ——> 發(fā)送給設(shè)備4724端口 ——>?通過(guò)設(shè)備4724端口發(fā)給bootstrap.jar ——>?Bootstrap.jar把命令發(fā)給uiautomator:

創(chuàng)建session成功之前,就已將bootstrap.jar放入手機(jī)中,并開啟設(shè)備上的基于appium bootstrap的socket服務(wù),綁定本機(jī)和boostrap通信的端口號(hào)4724用于和Android設(shè)備通訊,默認(rèn)監(jiān)聽4724端口,等待client的連接。

Appium server將腳本的請(qǐng)求解析后給到4724端口,通過(guò)設(shè)備的4724端口轉(zhuǎn)發(fā)解析后的請(qǐng)求, 此時(shí),對(duì)于socket服務(wù)來(lái)說(shuō),appium server就充當(dāng)了client的角色,appium server通過(guò)4724端口主動(dòng)去請(qǐng)求設(shè)備上的socket服務(wù),即向socket服務(wù)發(fā)送請(qǐng)求,即bootstrap.jar,Bootstrap.jar再把Appium的命令轉(zhuǎn)換成uiautomator的命令來(lái)讓uiautomator進(jìn)行處理。有請(qǐng)求就有返回,socket接收到請(qǐng)求后會(huì)做出響應(yīng),原路返回給腳本,然后腳本再進(jìn)行下一次的請(qǐng)求。

網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)連接的一端稱為一個(gè)socket。appium和手機(jī)的通信過(guò)程,主要是數(shù)據(jù)交換的一個(gè)過(guò)程,socket的作用是就是為了實(shí)現(xiàn)雙向通信,它需要一對(duì)端口號(hào),對(duì)應(yīng)到這里就是4724,手機(jī)端的bootstrap就是socket-server端,appium server就是socket-client端。

關(guān)于socket的通信原理,先從服務(wù)器端說(shuō)起。服務(wù)器端先初始化Socket,然后與端口綁定(bind),對(duì)端口進(jìn)行監(jiān)聽(listen),調(diào)用accept阻塞,等待客戶端連接。在這時(shí)如果有個(gè)客戶端初始化一個(gè)Socket,然后連接服務(wù)器(connect),如果連接成功,這時(shí)客戶端與服務(wù)器端的連接就建立了。客戶端發(fā)送數(shù)據(jù)請(qǐng)求,服務(wù)器端接收請(qǐng)求并處理請(qǐng)求,然后把回應(yīng)數(shù)據(jù)發(fā)送給客戶端,客戶端讀取數(shù)據(jù),最后關(guān)閉連接,一次交互結(jié)束。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一直用的是Appium,最近在研究WebDriverAgent,對(duì)二者之間的區(qū)別和聯(lián)系有了更深的認(rèn)知,Appium...
    七月尾巴_葵花閱讀 8,684評(píng)論 0 14
  • 前段時(shí)間在做appium自動(dòng)化的工作,也進(jìn)行了一些實(shí)踐,現(xiàn)在實(shí)踐告一段落,是時(shí)候了解一下工作原理了,好為以...
    hellokitty小丸子閱讀 2,287評(píng)論 0 6
  • 前言 要想深入地掌握任何一門測(cè)試工具,對(duì)工具本身的架構(gòu)、原理、使用的協(xié)議及相關(guān)知識(shí)點(diǎn)都必須要有相關(guān)的了解和認(rèn)識(shí),才...
    0xAI閱讀 4,773評(píng)論 3 55
  • 1.架構(gòu)原理 Appium架構(gòu)由客戶端(Appium client)和服務(wù)器(Appium server)兩部分組...
    冬季戀歌1218閱讀 1,555評(píng)論 0 1
  • 軟件測(cè)試教程 自動(dòng)化測(cè)試appium篇 本課程主要講解自動(dòng)化測(cè)試工具appium。 下面以android app測(cè)...
    zzulj閱讀 3,990評(píng)論 0 8