作測試開發的童鞋都知道,UI自動化你繞不開selenium, webdrvier, appium框架,那麼這三者之間有什麼關聯,它們的原理是什麼呢?java
簡單來講就是:python
Selenium2 將瀏覽器原生的API封裝成WebDriver API ,webdriver 是基於 http協議的;ios
appium是基於 webdriver 協議添加對移動設備自動化api擴展而成的,基於tcp/ip協議(使用了socket接口)web
推論: 凡是牽扯到客戶端和服務器交互的,都有Http 協議面試
凡是牽扯到移動端社保的,都有tcp/ip 協議(封裝成socket接口)json
面試的時候如何口述Selenium 原理?bootstrap
Selenium 是將各個瀏覽器的API封裝成" Selenium本身設計定義的協議,名字叫作The WebDriver Wire Protocol " 的webdriver API api
操做層面:瀏覽器
一、測試人員編寫UI自動化測試腳本(java,python等等),運行腳本後,程序會打開指定的webdriver瀏覽器ruby
2. webdriver瀏覽器做爲一個remote-server 接受腳本的命令,同時webservice會打開一個端口:http://localhost:46350 瀏覽器則會監聽這個端口
二、webservice會將腳本語言翻譯成json格式傳遞給瀏覽器執行操做命令
邏輯層面:
一、測試人員執行測試腳本後,就建立了一個session, 經過http 請求向webservice發送了restfull的請求。
二、webservice翻譯restfull的請求爲瀏覽器能懂的腳本,而後接受腳本執行結果。
三、webservice將結果進行封裝--json 給到客戶端client/測試腳本 ,而後client就知道操做是否成功,同時測試也能夠進行校驗了。
口述appium的原理:
appium-IOS 和安卓都差很少,有細小差異,分PC和手機兩塊講:
一、首先是PC端, 測試人員執行測試腳本(java,python等腳本)經過appium client 轉換爲json格式傳遞給appium server
二、 appiumserver 啓動了一個監聽端口例如4724, 同時向手機端adb push 一個bootstrap.jar/bootstrap.js 的腳本,手機端經過該腳本同時監聽端口4724
三、PC和手機端就經過這個端口實現了通訊和交互,基於socket通訊(一個封裝了TCP/IP協議的接口)
四、手機端經過該端口傳輸的命令執行APP, bootstrap裏面封裝了安卓和蘋果的自動化測試框架UIautomator(低版本的安卓是instrumentation ) 執行相應的命令
五、執行完操做後經過端口返回給PC端,PC端根據返回結果 json 作校驗,同時也知道了操做是否執行成功
因此UI自動化的底層仍是webdriver ,它是基於HTTP協議的,那麼HTTP的原理是什麼? 長鏈接短鏈接是什麼意思,下個博客總結:
Selenium是一個用於Web應用程序測試的工具,支持多平臺、多瀏覽器、多語言去實現自動化測試,Selenium2將瀏覽器原生的API封裝成WebDriver API,能夠直接操做瀏覽器頁面裏的元素,甚至操做瀏覽器自己(截屏,窗口大小,啓動,關閉,安裝插件,配置證書之類的),因此就像真正的用戶在操做同樣。
Webdriver的一個簡單的架構圖,以下圖所示:
WebDriver Wire協議是通用的,也就是說不論是FirefoxDriver仍是ChromeDriver,啓動以後都會在某一個端口啓動基於這套協議的Web Service。例如FirefoxDriver初始化成功以後,默認會從http://localhost:7055開始,而ChromeDriver則大概是http://localhost:46350之類的。接下來,咱們調用WebDriver的任何API,都須要藉助一個ComandExecutor發送一個命令,其實是一個HTTP request給監聽端口上的Web Service。在咱們的HTTP request的body中,會以WebDriver Wire協議規定的JSON格式的字符串來告訴Selenium咱們但願瀏覽器接下來作什麼事情。
能夠更通俗的理解:因爲客戶端腳本(java, python, ruby)不能直接與瀏覽器通訊,這時候能夠把WebService當作一個翻譯器,它能夠把客戶端代碼翻譯成瀏覽器能夠識別的代碼(好比js).客戶端(也就是測試腳本)建立1個session,在該session中經過http請求向WebService發送restful的請求,WebService翻譯成瀏覽器懂得腳本傳給瀏覽器,瀏覽器把執行的結果返回給WebService,WebService把返回的結果作了一些封裝(通常都是json格式),而後返回給client,根據返回值就能判斷對瀏覽器的操做是否是執行成功
舉個實際的例子:
Appium是 c/s模式的
appium是基於 webdriver 協議添加對移動設備自化api擴展而成的
webdriver 是基於 http協議的,第一鏈接會創建個 session 會話,並經過 post發送一個 json 告知服務端相關測試信息
IOS 原理圖
appium ios封裝了 封裝了 封裝了 apple 的 Instruments 框架,主要用了 Instrument裏的 UIAutomation(Apple 的自動化測試框架),而後在設備中注入 bootstrap.js 進 行監 聽。
Client ent是咱們編寫的 webdriver腳本 ,中間是 appium啓動 server (默認監聽 4723 端口 ),
appium server 調用 instruments.js啓動一個 socket server ,同時分出一個 子進程運⾏instruments.app 將 bootstrap.js(一個 UIAutomation 腳本)注 ⼊入到 devices⽤於和外界進行交 。
最後 Bootstrap.js將執行的結果返回給 將執行的結果返回給 appium server ,appium server再將結果返回給 appium client 。
Android原理圖
4.2 之後是基於 uiautomator框架實現查找注入事件的, 框架實現查找注入事件的,框架實現查找注入事件的, 4.2 之前則是 instrumentation i框架的,並封裝成一個叫 Selendroid 這玩意提供服務
Client ent是咱們編寫的 webdriver 腳本。中間是 appium啓動 server (默認監聽 4723 端口 ),
appium server 會把請求轉發給中間件 會把請求轉發給中間件 Bootstrap.jar ,它是用java寫的,安裝在手機上 .Bootstrap監聽 4723端口並接收appium 的命令,最終經過調用 UiAutomator 的命令來實現。Bootstrap將執行的結果返回給返回給 appium server 。Appiumserver再將結果返回給 client端(PC)。