和appium內(nèi)部原理總結(jié)
為什么會(huì)有這篇?
前段時(shí)間學(xué)習(xí)了selenium的使用,今天開始接觸appium看到appium的原理后產(chǎn)生了疑惑:
現(xiàn)在的selenium是通過webdriver來操作驅(qū)動(dòng)的,然而appium有一個(gè)的概念
那么為什么沒有 driver這個(gè)東西呢?
selenium
早期的selenium
早期的selenium主要是指selenium1.0的版本,
這個(gè)版本主要由Selenium IDE + Selenium Grid + SeleniumRC組成
seleniumRC就是后來被webdriver取代的一個(gè)代理server
RC == Remote Control 遠(yuǎn)程控制
早期Selenium 引入了 Remote Control Server 這樣一個(gè)代理 Server,JavaScript. 腳本注入和與 Server 通訊都通過這個(gè)代理 Server 來進(jìn)行,JavasScript可以獲取并調(diào)用頁(yè)面的任何元素,Selenium啟動(dòng)一個(gè)Server,將操作元素的API調(diào)用轉(zhuǎn)化為一段段JavaScript,在Selenium內(nèi)核啟動(dòng)瀏覽器之后注入這段JS
缺點(diǎn):但是JS注入速度不理想,穩(wěn)定性大大依賴于Selenium內(nèi)核對(duì)API翻譯成的JS質(zhì)量高低
引入代理Remote Control Server是因?yàn)椤巴床呗浴钡南拗?,通過這個(gè)代理服務(wù)器來“欺騙”遠(yuǎn)程Server,達(dá)到使其以為是從同一個(gè)地方load代碼以正確返回請(qǐng)求數(shù)據(jù)的效果
seleniumRC的原理
Selenium RC Server 啟動(dòng)一個(gè)瀏覽器(或是已經(jīng)使用中),并注入js代碼
將腳本代碼傳到客戶端的 Selenium-Core 中
Selenium-Core 翻譯并解析執(zhí)行用戶錄制的操作
讓代理 Server 進(jìn)行通訊
Remote Control Server 負(fù)責(zé)跟遠(yuǎn)程 Web 應(yīng)用服務(wù)器進(jìn)行通訊
seleniumRC的組成
Selenium Server(Launcher、Http Proxy、Selenium Core)
Client Libraries(用來控制server)
seleniumRC的工作流程
通過Client Libraries的接口向Selenium Server發(fā)送Http請(qǐng)求,要求和Selenium Server建立連接
Selenium Server的Launcher啟動(dòng)瀏覽器,把Selenium Core加載入瀏覽器頁(yè)面中,并發(fā)瀏覽器的代理設(shè)置為Selenium Server的Http Proxy。
測(cè)試用例通過Client Libraries的接口向Selenium Server發(fā)送Http請(qǐng)求,Selenium Server對(duì)請(qǐng)求進(jìn)行解析,然后通過Http Proxy發(fā)送JS命令通知Selenium Core執(zhí)行操作瀏覽器的動(dòng)作
Selenium Core接收到指令后,執(zhí)行操作
瀏覽器收到新的頁(yè)面請(qǐng)求信息,于是發(fā)送Http請(qǐng)求,請(qǐng)求新的web頁(yè)面。Selenium Server會(huì)接收到所有由它啟動(dòng)的瀏覽器發(fā)動(dòng)的請(qǐng)求
Selenium Server接收到瀏覽器發(fā)送的Http請(qǐng)求后,自己重組Http請(qǐng)求,獲取對(duì)應(yīng)的web頁(yè)面
Selenium Server的Http Proxy把接收的Web頁(yè)面返回給瀏覽器
現(xiàn)在的selenium
selenium3.0以后移除了seleniumRC,取而代之的是webdriver
用一張圖來展示selenium3.0的運(yùn)行原理
這里講到的是測(cè)試腳本和瀏覽器的交互,客戶端開始運(yùn)行驅(qū)動(dòng)瀏覽器的腳本的時(shí)候,這時(shí)瀏覽器收到請(qǐng)求開始啟動(dòng)并開啟偵聽端口,并自動(dòng)創(chuàng)建session,保持瀏覽器和對(duì)應(yīng)客戶端的會(huì)話連接,然后客戶端運(yùn)行腳本,向?yàn)g覽器發(fā)送http請(qǐng)求,瀏覽器解析請(qǐng)求,根據(jù)腳本內(nèi)容做出相應(yīng)操作,返回response。這時(shí)客戶端根據(jù)response選擇結(jié)束還是繼續(xù)執(zhí)行
tips:
webdriver操作瀏覽器、頁(yè)面采用的協(xié)議:the webdriver wire protocol
Client和Server的通信協(xié)議:HTTP
HTTP傳輸?shù)臄?shù)據(jù)內(nèi)容為遵循WP協(xié)議json格式數(shù)據(jù)
瀏覽器驅(qū)動(dòng)實(shí)現(xiàn)了webdriver協(xié)議的api
appium
appium和selenium之間的不同
appium本身就是一個(gè)server,而selenium廢棄了server,用webdriver來驅(qū)動(dòng)瀏覽器
appium工作原理
當(dāng)開啟appium服務(wù)器的同時(shí)就開啟了監(jiān)聽端口;我們運(yùn)行腳本的時(shí)候,調(diào)用任何的appiumAPI,都會(huì)向Appium Server端post一條HTTP請(qǐng)求,請(qǐng)求內(nèi)容就是根據(jù)webdriver wire protocol協(xié)議規(guī)定的一條JSON格式的數(shù)據(jù);Appium Server端接收到請(qǐng)求后,解析出JSON數(shù)據(jù)并發(fā)送到端;手機(jī)端上已經(jīng)由BootStrap.jar(iOS為BootStrip.js)開啟的socket服務(wù)器監(jiān)聽相應(yīng)的端口,BootStrap.jar在appium每個(gè)session第一次訪問手機(jī)端的時(shí)候會(huì)自動(dòng)安裝;手機(jī)端接收到對(duì)應(yīng)的請(qǐng)求后,通過BootStrap.jar翻譯成UIAutomator能執(zhí)行的命令,然后通過UIAutomator處理并操作APP完成測(cè)試。
appium的幾個(gè)概念
appium/appium server
一般所說的appium其實(shí)是一個(gè)基于node.js的web服務(wù)器,它是測(cè)試腳本和設(shè)備端交互的橋梁
appium GUI
它是把沒有界面的appium server封裝出了一個(gè)圖形界面,方便操作,但是現(xiàn)在已經(jīng)被appium desktop所取代
appium Desktop
它是一款適用于Mac,和的開源應(yīng)用程序,它以美觀而靈活的用戶界面為您提供appium server的強(qiáng)大功能
appium client
第1點(diǎn)中說到,appium其實(shí)是一個(gè)sweb server,server是接收請(qǐng)求來操作設(shè)備端的app的,既然有了server那么一定會(huì)有client
這個(gè)client就是我們寫測(cè)試腳本時(shí)導(dǎo)入的包
中可以運(yùn)行 pip install Appium-Python-Client 來安裝
和 iOS