Appium工作原理

一.Appium框架組成?

Appium框架組成是自動化腳本即client端(通過Java編寫的代碼护奈,也可以通過其他語言編寫)繁涂,Appium指令服務(wù)器妆兑,sdk通信環(huán)境(Android模擬器)或移動端設(shè)備(這里是測試Windows平臺的設(shè)備呀打,)肪虎。

? 二.Appium通信原理:

Appium通信原理:Client端發(fā)送自動化指令給Appium?server,Appium Server接收到client發(fā)送的指令后哮幢,轉(zhuǎn)換為移動端能夠識別的指令带膀,然后發(fā)送給移動端設(shè)備,并對移動端設(shè)備進行操作橙垢。

如下圖垛叨,Android設(shè)備的appium自動化原理。?

? 2.1 Client端:

一般來說就是運行代碼的機器柜某,即我們是用Java語言編寫的代碼嗽元,也可以用其他Selenium支持Python,ruby喂击,C#等語言來編寫剂癌,Appium提供的Appium-client API是Appium通過擴展Selenium的Webdriver協(xié)議而來的,我們編寫代碼的時只要實現(xiàn)Webdriver標(biāo)準(zhǔn)協(xié)議即可翰绊。

? 2.2 Appium Server:

Appium Server功能是監(jiān)聽接口佩谷,接收client端發(fā)送的command,然后將command轉(zhuǎn)為移動端能夠識別的command监嗜,然后發(fā)送給移動設(shè)備進行操作谐檀,再等待移動設(shè)備返回來的操作結(jié)果,將操作結(jié)果發(fā)送給client端裁奇。 Appium server是可以放在client端稚补,也可以放在云端。 Appium server 默認(rèn)的端口號是4723框喳,用于Appium server監(jiān)聽client端的發(fā)送來的請求课幕。

2.3 Android設(shè)備

? ? ?Android端,Appium基于Webdriver協(xié)議五垮,利用Bootstrap.jar,最后通過調(diào)用UIautomatior命令乍惊,實現(xiàn)APP的自動化測試(Android4.2以前的版本是用Instrumentation框架,通過綁定另外一個獨立的selendroid項目來實現(xiàn))放仗,Android4.2以后的版本是用UIautomator)润绎。UIAutomator測試框架是Android SDK自帶的APP UI自動化測試Java庫,另外UIAutomator對H5支持有限诞挨,Appium引入了Chromedriver以及Safaridriver來實現(xiàn)H5的自動化莉撇。

在Android設(shè)備的工作過程:

? 1.Appium server將監(jiān)聽到的4723端口的指令,轉(zhuǎn)發(fā)給中間件Bootstrap.jar惶傻,Bootstrap.jar是用Java編寫的棍郎,安裝在Android手機上;

? 2.Bootstrap監(jiān)聽4724端口并接收Appium server的指令银室;

? 3.Bootstrap再通過調(diào)用UIautomator的命令來實現(xiàn)具體的command操作涂佃。

? 4.最后Bootstrap將執(zhí)行的結(jié)果返回給Appium server励翼。

三、appium的整體架構(gòu)是C/S模式辜荠,整體流程(返回順序為逆向):

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

appium工作流程

1汽抚、腳本請求 ——> 4723端口appium server :

首先我們要開啟appium服務(wù),即Appium server伯病,默認(rèn)監(jiān)聽4723端口造烁。4723端口專門和腳本打交道,基于WebDriver協(xié)議午笛。webdriver是按照server – client的經(jīng)典設(shè)計模式設(shè)計的惭蟋,作用就是啟動基于WebDriver Wire協(xié)議的appium服務(wù),接下來腳本與appium server的通信實際上是一個HTTP request請求給appium server季研,在請求的body中,會以WebDriver Wire協(xié)議規(guī)定的JSON格式的字符串來告訴appium服務(wù)我們希望設(shè)備接下來做什么事情誉察。

appium中的Json wire protocol繼承自selenium的webdriver wire protocol与涡,并進行了擴展,使得Json wire protocol能夠控制不同的移動設(shè)備的行為持偏。

上面說到的是腳本請求對設(shè)備進行操作驼卖,但前提是,我們要對誰進行操作測試呢鸿秆?這里就引入一個新名詞:desired Capabilities酌畜。了解了上述之后,再去看腳本怎么將desired Capabilities傳遞給appium server就明白多了卿叽,腳本通過Json Wire Protocol協(xié)議以json格式發(fā)送測試設(shè)備信息給server端桥胞,測試設(shè)備信息被攜帶在Desired Capabilities中,這個東西實質(zhì)上是一個key-value形式的對象考婴,Desired Capabilities最重要的作用是告訴server本次測試的上下文贩虾。這次是要進行瀏覽器測試還是移動端測試?如果是移動端測試的話是android還是ios沥阱?如果android的話我們要測試哪個app缎罢?server的這些疑問Desired Capabilities都必須給予解答,否則server不買賬考杉,針對我們現(xiàn)在所說的安卓策精,它帶來的影響就是無法完成app的啟動。

那么崇棠,將測試設(shè)備信息告知之后咽袜,是不是就可以開始進行測試了呢?答案是:NO枕稀。這里又要引入一個名詞:session酬蹋。session就是一個會話及老,在webdriver/appium,你的所有工作永遠都是在session start后才可以進行的范抓。client 創(chuàng)建1個session骄恶,在該session中通過http向appium server發(fā)送請求,appium server解析請求匕垫,完成相應(yīng)操作并返回response僧鲁。

session

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

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

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

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

Appium server將腳本的請求解析后給到4724端口檬洞,通過設(shè)備的4724端口轉(zhuǎn)發(fā)解析后的請求, 此時沟饥,對于socket服務(wù)來說添怔,appium server就充當(dāng)了client的角色,appium server通過4724端口主動去請求設(shè)備上的socket服務(wù)贤旷,即向socket服務(wù)發(fā)送請求广料,即bootstrap.jar,Bootstrap.jar再把Appium的命令轉(zhuǎn)換成uiautomator的命令來讓uiautomator進行處理幼驶。有請求就有返回艾杏,socket接收到請求后會做出響應(yīng),原路返回給腳本盅藻,然后腳本再進行下一次的請求购桑。

網(wǎng)絡(luò)上的兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換,這個連接的一端稱為一個socket萧求。appium和手機的通信過程,主要是數(shù)據(jù)交換的一個過程其兴,socket的作用是就是為了實現(xiàn)雙向通信顶瞒,它需要一對端口號夸政,對應(yīng)到這里就是4724,手機端的bootstrap就是socket-server端榴徐,appium server就是socket-client端守问。

關(guān)于socket的通信原理,先從服務(wù)器端說起坑资。服務(wù)器端先初始化Socket耗帕,然后與端口綁定(bind),對端口進行監(jiān)聽(listen)袱贮,調(diào)用accept阻塞仿便,等待客戶端連接。在這時如果有個客戶端初始化一個Socket攒巍,然后連接服務(wù)器(connect)嗽仪,如果連接成功,這時客戶端與服務(wù)器端的連接就建立了柒莉∥偶幔客戶端發(fā)送數(shù)據(jù)請求,服務(wù)器端接收請求并處理請求兢孝,然后把回應(yīng)數(shù)據(jù)發(fā)送給客戶端窿凤,客戶端讀取數(shù)據(jù)仅偎,最后關(guān)閉連接,一次交互結(jié)束雳殊。

參考資料:

http://www.reibang.com/p/30b3b2d6b901

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末橘沥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子相种,更是在濱河造成了極大的恐慌威恼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寝并,死亡現(xiàn)場離奇詭異箫措,居然都是意外死亡,警方通過查閱死者的電腦和手機衬潦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門斤蔓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人镀岛,你說我怎么就攤上這事弦牡。” “怎么了漂羊?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵驾锰,是天一觀的道長。 經(jīng)常有香客問我走越,道長椭豫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任旨指,我火速辦了婚禮赏酥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谆构。我一直安慰自己裸扶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布搬素。 她就那樣靜靜地躺著呵晨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熬尺。 梳的紋絲不亂的頭發(fā)上摸屠,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音猪杭,去河邊找鬼餐塘。 笑死,一個胖子當(dāng)著我的面吹牛皂吮,可吹牛的內(nèi)容都是我干的戒傻。 我是一名探鬼主播税手,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼需纳!你這毒婦竟也來了芦倒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤不翩,失蹤者是張志新(化名)和其女友劉穎兵扬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體口蝠,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡器钟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了妙蔗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傲霸。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖眉反,靈堂內(nèi)的尸體忽然破棺而出昙啄,到底是詐尸還是另有隱情,我是刑警寧澤寸五,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布梳凛,位于F島的核電站,受9級特大地震影響梳杏,放射性物質(zhì)發(fā)生泄漏韧拒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一秘狞、第九天 我趴在偏房一處隱蔽的房頂上張望叭莫。 院中可真熱鬧蹈集,春花似錦烁试、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至郭怪,卻和暖如春支示,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鄙才。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工颂鸿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人攒庵。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓嘴纺,卻偏偏與公主長得像败晴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子栽渴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355