2025年【Appium学习总结1】----原理

【Appium学习总结1】----原理Appium 是一个开源工具 用于自动化 iOS 手机 Android 手机和 Windows 桌面平台上的原生 移动 Web 和混合应用 appium 安卓设备通信流程 脚本 gt appium server gt bootstrap

大家好,我是讯享网,很高兴认识大家。

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: -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/-e5a6-4ce8-8df7-cedea24cedba/element

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

[MJSONWP ()] Calling AppiumDriver.findElement() with args: ["xpath","//*[@text='允许']","-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":"-1536-4b5f-8179-380ab057a3c2","element-6066-11e4-a52e-4fcecf":"-1536-4b5f-8179-380ab057a3c2"}}

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

[HTTP] <-- POST /wd/hub/session/-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中的方法去运行

 

 

小讯
上一篇 2025-03-16 12:51
下一篇 2025-03-06 14:20

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/60431.html