Appium-Uiautomator2-Server原理分析
簡單概括一下:
- appium-uiautomator2-server 是針對Google推出的 UIAutomator V2
- Github地址:https://github.com/appium/appium-uiautomator2-server
- 在這之前,Appium通過appium-android-bootstrap實現與UIAutomator v1的交互
- UiAutomator2修復了v1中遇到的大多數問題,最重要的是實現了與Android系統更新的分離
- 我們都知道appium只有在uiautomator2下可以實現對toast的識別
- 那是因為Google新增了AccessibilityService服務,重寫該服務可以實現對Notification和Toast內容的捕捉
- 通信模塊使用了Netty Server,較之bootstrap使用的ServerSocket,Netty是一個高性能、異步驅動的NIO框架,占用內存少,性能更好
運行原理
- 客戶端通過傳遞desired capabilities給appium node server來創建一個session,appium server根據automationName去啟動對應的driver,默認是android-driver
- 若automationName設為UIAutomator2,appium會調用appium-uiautomator2-driver,同時將uiautomator2 server的兩個apk安裝到測試設備上
-
- io.appium.uiautomator2.server.apk,執行handlers
- io.appium.uiautomator2.server.test.apk,只有一個test,用於啟動server
- AppiumServlet ,管理請求的路由,將driver發過來的請求轉發給對應Handler
- Handler,調用UiAutomator V2去執行指定操作,操作的結果經AppiumResponse統一封裝
- AppiumResponse,操作結果返回給appium-uiautomator2-driver,再將結果返給客戶端
———————————————————————————————————————————
Appium的原理
WebDriver script:我們的測試腳本(java or python)
Appium:
會首先開啟一個監聽4723端口的server,接收測試腳本發送過來的對應請求
再將對應的請求發送給中間件Bootstrap.jar(注意這里的請求不是整個腳本文件,而是對應的命令請求,比如:點擊一個元素就是一條請求)
Bootstrap.jar:
監聽4723端口由appium發送過來的相關請求,並且將請求轉換成UiAutomator可以識別的命令發給UiAutomator進行處理
——————————————————————————————————————————————————————————
Android原理圖:
Client 是我們編寫的 webdriver 腳本。中間是 appium啟動 server (默認監聽 4723 端口 )
appium server 會把請求轉發給中間件 Bootstrap.jar ,它是用java寫的,安裝在手機上
.Bootstrap監聽 4723端口,並接收appium 的命令
最終通過調用 UIAutomator的命令來實現,Bootstrap將執行的結果返回給 Appium server ,Appium server再將結果返回給 client端
——————————————————————————————————————————————————————————
IOS原理圖:
appium ios封裝了 apple 的 Instruments I框架,主要用了instrumentation框架里的 UIAutomation自動化測試框架
然后在設備中注入 bootstrap.js 進 行監 聽
Client 是我們編寫的 webdriver腳本 ,中間是 appium啟動 server (默認監聽 4723 端口 )
appium server 調用 instruments.js啟動 一個 socket server ,
同時分出一個子進程,運⾏instruments.app 將 bootstrap.js(一個 UIAutomation 腳本)注入到 devices⽤於和外界進行交互
最后 Bootstrap.js將執行的結果返回給 appium server ,appium server再將結果返回給 client
——————————————————————————————————————————————————————————
初步認識appium工作過程
1.appium 是c/s模式的
2.appium 是基於 webdriver 協議添加對移動設備自動化api擴展而成的,所以具有和 webdriver 一樣的特性,比如多語言支持
3.webdriver 是基於http協議的,第一連接會建立一個session會話,並通過post發送一個json告知服務端相關測試信息
4.對於android來說,4.2以后是基於uiautomator框架實現查找注入事件的,4.2以前則是instrumentation框架的,並封裝成一個叫Selendroid的東西提供服務的
5.客戶端只需要發送http請求實現通訊,意味着客戶端就是多語言支持的
6.appium 服務端是node.js寫的,所以你安裝的時候無論哪個平台都是先裝node
Bootstrap介紹
1)Bootstrap作用:
Bootstrap是Appium在初始化的時候推送到安卓手機上的一個UiAutomator測試腳本
該腳本的唯 一 一 個測試方法所做的事情是在手機端開啟一個SocketServer(通信模塊),用來監聽Appium從PC端過來的命令發送給UiAutomator來執行處理
它會監聽4724端口獲得命令,然后pass給UiAutomator來做處理
2)Bootstrap在appium中扮演的角色:
首先,Bootstrap是uiautomator的測試腳本,它的入口類bootstrap繼承於UiautomatorTestCase,所以Uiautomator可以正常運行它
它也可以正常使用uiautomator的方法,這個就是appium的命令可以轉換成uiautomator命令的關鍵
其次,bootstrap是一個socket服務器,專門監聽4724端口過來的appium的連接和命令數據,並把appium的命令轉換成uiautomator的命令來讓uiautomator進行處理
最后,bootstrap處理的是從pc端過來的命令,而非一個文件
所使用的技術
Android上使用了instrumentation和uiautomator兩套技術
iOS使用uiautomation
同時還支持firefox, 並可擴展其他平台
默認開啟4723端口接受webdriver請求 ,4723是appium服務的,專門和腳本打交道;
默認開啟4724用於和Android設備通訊
Apabilities
Capabilities是由客戶端發送給Appium服務器端的
用來告訴服務器去啟動哪種我們想要的會話的一套鍵值對集合
當中也有一些鍵值對是用來在自動化的過程中修改服務器端的行為方式
自我理解的工作原理
Appium啟動時會創建一個http:127.0.0.1:4723/wd/hub服務端(相當於一個中轉站)
腳本會告訴服務器我要做什么,服務端再去跟設備打交道,服務端完成了腳本交給他的任務之后
服務端和設備如何通訊?
通過接口來訪問,意味着服務端和腳本可以不在一起,只要能訪問到127.0.0.1:4723這個地址就可以
服務端和設備默認使用4724端口進行通訊的,底層調用uiautomator工具
在測試的時候服務端會給設備扔一個jar包就是appiumbootstrap.jar,會啟動這個包
啟動之后會在手機上創建一個socket服務,暴露的就是4724的端口
相對於socket服務來說,appium服務端又是一個客戶端;
服務端的4724可以修改,設備上的不可以
服務端收到腳本傳遞過來的命令之后,通過電腦上的4724端口,向設備上的4724端口發送指令
appiumbootstrap.jar收到指令后回去完成點擊,滑動其他的操作
完成之后再通過服務,給服務端一個相應。服務端收到之后再去響應腳本