最近可貴有時間,整理一下目前經常使用的自動化測試框架的原理,在搬運工的基礎上總結一下,便於理解;html
1) Appium原理java
Appium是 c/s模式的
appium是基於 webdriver 協議添加對移動設備自化api擴展而成的
webdriver 是基於 http協議的,第一鏈接會創建個 session 會話,並經過 post發送一個 json 告知服務端相關測試信息python
IOS 原理圖( 來源於:百度 )android
appium ios封裝了 封裝了 封裝了 apple 的 Instruments I框架,主要用了 框架,主要用了 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 。ios
Android原理圖( 來源於:百度)git
4.2 之後是基於 uiautomator框架實現查找注入事件的, 框架實現查找注入事件的,框架實現查找注入事件的, 4.2 之前則是 instrumentation i框架的,並封裝成一個叫 框架的, Selendroid 這玩意提供服務
Client ent是咱們編寫的 webdriver 腳本。中間是 appium啓動 server (默認監聽 4723 端口 ),
appium server 會把請求轉發給中間件 會把請求轉發給中間件 Bootstrap.jar ,它是用java寫的,安裝在 手機上 .Bootstrap監聽 4723端口並接收appium 的命令,最終經過調 的命令過調 用 UiAutomator U 的命令來實現。
Bootstrap將執行的結果返回給 將執行的結果返回給 appium server 。
Appiumserver再將結果返回給 client端。github
2)Uiautomator2 原理web
1. Uiautomator2是一個可使用Python對Android設備進行UI自動化的庫。其底層基於Google uiautomator,Google提供的uiautomator庫能夠獲取屏幕上任意一個APP的任意一個控件屬性,並對其進行任意操做,目前僅支持android平臺的原生應用測試,https://github.com/openatx/uiautomator2, 使用python編寫測試腳本;
2.工做原理json
分爲兩個部分:
PC上的python端:運行腳本,並向系統設備發送http請求
移動設備:移動設備上運行了封裝了uiautomator2的HTTP服務,解析收到的請求,並轉化成uiautomator2的代碼。
3.整個過程
如下解釋直接引用網址:https://testerhome.com/topics/11357
① 在移動設備上安裝atx-agent(守護進程), 隨後atx-agent啓動uiautomator2服務(默認7912端口)進行監聽
② 在PC上編寫測試腳本並執行(至關於發送HTTP請求到移動設備的server端)
③ 移動設備經過WIFI或USB接收到PC上發來的HTTP請求,執行指定的操做bootstrap
3. UiAutomator、UiAutomator二、Bootstrap的關係
3.1 UiAutomator和bootstrap:
UiAutomator是Android自動化測試框架,是谷歌在Android4.1版本發佈時推出的一款用Java編寫的UI測試框架。其最大的特色就是能夠跨進程操做,咱們可使用UiAutomator框架提供的一些方便的API來對安卓應用進行一系列的自動化測試操做,如點擊、滑動、鍵盤輸入、長按以及經常使用的斷言方法等。能夠替代之前繁瑣的手工測試。
Bootstrap是Appium在初始化的時候推送到安卓手機上的一個UiAutomator測試腳本,該腳本的惟一一個測試方法所作的事情是在手機端開啓一個SocketServer(通訊模塊),用來監聽Appium從PC端過來的命令發送給UiAutomator來執行處理。
下圖爲官方提供的原理圖:
WebDriver script:
咱們的測試腳本(java or python)
Appium:
會首先開啓一個監聽4723端口的server,接收測試腳本發送過來的對應請求,再講對應的請求發送給中間件Bootstrap.jar(注意這裏的請求不是整個腳本文件,而是對應的命令請求,好比:點擊一個元素就是一條請求)
Bootstrap.jar:
監聽4724端口由appium發送過來的相關請求,而且將請求轉換成UiAutomator能夠識別的命令發給UiAutomator進行處理
UiAutomator2:
說到這裏相信你們已經瞭解了這二者的關係,那爲何還會有UiAutomator2,難道是UiAutomator的升級版本?沒錯!
appium在最近有加入了UiAutomator2(也可稱爲UiAutomator V2)來支持實現Android端自動化,原理同以前的UiAutomator+Bootstrap有很大的不一樣:
爲了可以支持UiAutomator2,Appium引入了appium-uiautomator2-server
如下是其官網的wiki介紹,英文基礎較好的同窗能夠去看看
https://github.com/appium/appium-uiautomator2-server/wiki
確定仍是有比較多同窗對英文犯暈的,那我就給你們翻譯翻譯下:
一、Appium使用UiAutomator2的目的是爲了替換掉以前的UiAutomator+Bootstrap模式
二、Bootstrap是基於UiAutomator V1(即爲UiAutomator)的,可是UiAutomator不少Api基本上官方再也不維護了
三、UiAutomator V2修復了UiAutomator V1中遇到的大多數問題,最重要的是實現了與Android系統更新的分離
有看到咱們公開課的同窗或者VIP課程的同窗比較清楚:在獲取到toast信息的時候須要將automationName設置成UiAutomator2,就是由於在UiAutomator2上新增了AccessibilityService服務,能夠實現Toast的獲取。
如下是其使用原理圖:
WebDriver script:
不用多說,就是咱們的執行腳本
Appium:
客戶端傳遞desired capabilities屬性配置給Appium Server來建立一個會話,Appium Server會調用appium-uiautomator2-driver,同時將UiAutomator2 server的兩個apk安裝到測試設備上
一、appium-uiautomator2-server-vx.x.x.APK
二、appium-uiautomator2-server-debug-androidTest.apk
UiAutomator2 server兩個apk的做用:
一、UiAutomator2 驅動模塊,負責建立會話,安裝UiAutomator2-server.apk到設備上,開啓Netty(這是一個通訊框架,至關於Bootstrap使用的SocketServer升級版本)
二、UiAutomator2服務器模塊,當驅動模塊創初始化完畢,服務器就會監聽PC端Appium發送過來的請求,將請求發送給真正底層的UiAutomator2。
參考文章:1) Appium原理解析 ( https://www.cnblogs.com/yulei126/p/6804216.html)2) Appium原理 (https://www.cnblogs.com/csj2018/p/9937511.html)3) Uiautomator2原理介紹 (https://blog.csdn.net/zhuhuahong/article/details/81868671)4)UiAutomator、UiAutomator二、Bootstrap的關係 (https://www.cnblogs.com/yyoba/p/9675071.html)