appium工作原理及方法

Appium 是一个开源工具,用于自动化 iOS 手机、 Android 手机和 Windows 桌面平台上的原生、移动 Web 和混合应用。 appium安卓设备通信流程: 脚本-----------------> appium server-----------------> bootstrap.jar----------------->

Appium 是一个开源工具,用于自动化 iOS 手机、 Android 手机和 Windows 桌面平台上的原生、移动 Web 和混合应用。

appium安卓设备通信流程:

脚本-----------------> appium server-----------------> bootstrap.jar-----------------> uiautomator2

脚本:PC端编写的自动化脚本

appium server:默认端口4723,负责监听4723

bootstrap.jar:在移动设备端开启一个socket服务把  从PC端发过来的命令转换为UIautomator   能够识别的命令并交给UIautomator执行                                       

uiautomator2:python格式的移动端UI测试框架,可以对安卓应用进行自动化测试操作

1、开启appium server服务,默认地址为0.0.0.0,端口为4723,并将测试设备信息告诉appium server

4723端口专门和脚本打交道,基于webdriver协议,webdriver作用就是启动基于webdriver wire协议的appium服务,接下来,脚本与appium server的通信实际是一个http request给appium server,请求body中,会以webdriver wire协议规定的json格式字符串告诉appium服务希望设备做什么

这里引入一个名词,disired capabilities,以key-value键值对存在,负责存储设备配置信息,通过post请求发给appium server,告诉server需要操作哪台设备,哪个应用

appium server启动日志:

[Appium] Welcome to Appium v1.21.0

[Appium] Non-default server args:

[Appium] relaxedSecurityEnabled: true

[Appium] allowInsecure: {

[Appium] }

[Appium] denyInsecure: {

[Appium] }

[Appium] Appium REST http interface listener started on 0.0.0.0:4723

[HTTP] --> POST /wd/hub/session

[HTTP] {"desiredCapabilities":{"platformName":"android","platformVersion":"7.0","deviceName":"MaxiSys device","appPackage":"com.autel.cloud.smsus","appActivity":"com.autel.cloud.maxifixhd.module.SmsWebViewActivity","ensureWebviewsHavePages":true},"requiredCapabilities":{}}

[MJSONWP]Calling AppiumDriver.createSession() with args: [{"platformName":"android","platformVersion":"7.0","deviceName":"MaxiSys device","appPackage":"com.autel.cloud.smsus","appActivity":"com.autel.cloud.maxifixhd.module.SmsWebViewActivity","ensureWebviewsHavePages":true},{},null]

从日志中可以分析得到appium server的启动地址为0.0.0.0,监听端口为4723,启动以后,会像URL为 /wd/hub/session的地址发送一个POST请求,请求内容就是desiredCapabilities下的内容,负责告诉appium server需要操控的设备信息

2、测试设备信息告诉appium server以后,需要创建session会话

session称为会话控制,session对象存储特定用户会话所需的属性及配置信息,对应到这里就是desirewd capabilities中的信息,脚本通过发送http请求,传入desired capabilities就可以开启session了,第一次创建,appium会调用androidDriver为client生成一个session和sessionId,并将sessionId作为响应返回给客户端,下次脚本发出操作请求是就会自带sessionId作为唯一标识,server按照此标识检索带有请求的session并使用

session的作用就是在appium服务上保持设备的状态信息,在多次操作行为中,配置信息不会丢失,程序就不会断开,不需要每次发送带配置信息的请求

创建session会话日志:

[Appium] Appium v1.21.0 creating new AndroidUiautomator2Driver (v1.65.0) session

[Appium] Applying relaxed security to 'AndroidUiautomator2Driver' as per server command line argument. All insecure features will be enabled unless explicitly disabled by --deny-insecure

[BaseDriver] Creating session with MJSONWP desired capabilities: {

[BaseDriver] "platformName": "android",

[BaseDriver] "platformVersion": "7.0",

[BaseDriver] "deviceName": "MaxiSys device",

[BaseDriver] "appPackage": "com.autel.cloud.smsus",

[BaseDriver] "appActivity": "com.autel.cloud.maxifixhd.module.SmsWebViewActivity",

[BaseDriver] "ensureWebviewsHavePages": true

[BaseDriver] }

[BaseDriver] Session created with session id: 50969533-e5a6-4ce8-8df7-cedea24cedba

3、appium server创建4724端口,将bootstrap.jar文件推送到移动设备

Appium server启动一个监听端口4724,同时向手机adb push一个bootstrap.jar脚本,移动设备端通过该脚本同时监听4724

设备通过该端口传输的命令执行APP,bootstrap.jar是appium运行在安卓测试机的一个UIautomator测试脚本,唯一功能就是在目标机器开启一个socket服务器把一个session中appium从pc端发过来的命令给Uiautomator执行处理

创建session成功之前,就已经把bootstrap.jar放入到了设备中,并开启设备上的基于appium bootstrap 的socket服务,监听4724端口,等待客户端连接

4、PC端脚本发送http请求给appium server,再转发给bootstrap.jar,经其转换为UIautomator可以识别的脚本去运行

请求发送日志:

[HTTP] --> POST /wd/hub/session/50969533-e5a6-4ce8-8df7-cedea24cedba/element

[HTTP] {"using":"xpath","value":"//*[@text='允许']","sessionId":"50969533-e5a6-4ce8-8df7-cedea24cedba"}

[MJSONWP (50969533)] Calling AppiumDriver.findElement() with args: ["xpath","//*[@text='允许']","50969533-e5a6-4ce8-8df7-cedea24cedba"]

[BaseDriver] Valid locator strategies for this request: xpath, id, class name, accessibility id, css selector, -android uiautomator

[BaseDriver] Waiting up to 0 ms for condition

[WD Proxy] Matched '/element' to command name 'findElement'

[WD Proxy] Proxying [POST /element] to [POST http://127.0.0.1:8200/wd/hub/session/2b43e5d0-73b7-4dd6-aedb-ad92829fd155/element] with body: {"strategy":"xpath","selector":"//*[@text='允许']","context":"","multiple":false}

[WD Proxy] Got response with status 200: {"sessionId":"2b43e5d0-73b7-4dd6-aedb-ad92829fd155","value":{"ELEMENT":"40799411-1536-4b5f-8179-380ab057a3c2","element-6066-11e4-a52e-4f735466cecf":"40799411-1536-4b5f-8179-380ab057a3c2"}}

[MJSONWP (50969533)] Responding to client with driver.findElement() result: {"element-6066-11e4-a52e-4f735466cecf":"40799411-1536-4b5f-8179-380ab057a3c2","ELEMENT":"40799411-1536-4b5f-8179-380ab057a3c2"}

[HTTP] <-- POST /wd/hub/session/50969533-e5a6-4ce8-8df7-cedea24cedba/element 200 597

UIautomator:

uiautomator是谷歌在android4.1版本发布时推出的一款UI测试框架,通过该框架提供的API对安卓应用进行自动化测试操作,第一款uiautomator是由java编写的,后来经过大神改编为python框架,也就是现在说的UIautomator2

boostrap为什么可以将PC端命令转换为UIaotumator可以识别脚本?

因为boostrap实际是一个UIautomator写的case包,它的入口类继承自UIautomatorTestCase,因此可以调用UIautomator中的方法去运行

 

 

知秋君
上一篇 2024-08-16 15:12
下一篇 2024-08-16 14:48

相关推荐