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中的方法去运行