一.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
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在計算機中,尤其是在網(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é)束雳殊。
參考資料: