UIAutomation对比appium_初始化


UIAutomation对比appium_客户端_02


UIAutomation对比appium_客户端_03


UIAutomation对比appium_初始化_04


appium简介

appium是一个移动端自动化框架,它采用C/S的设计模式,支持多类开发语言(java python js c#…)、支持多平台(ios android),支持跨平台使用(windows linux)。它适用于原生或混合移动应用;
appium继承了webDriver协议(也就是selenium 2),在其基础上做了扩展,使用JSON wire protocol协议驱动安卓和ios移动应用;

appium工作原理(安卓为例)

首先需要了解,appium不同的版本默认使用的不同的执行引擎
目前最新的版本是UIAutomator2(谷歌官方sdk提供的自动化工具)
appium就是将UIAutomator底层工具集成进来,通过一系列手段完成自动化测试

Appium1.13版本以后

UIAutomation对比appium_客户端_05

  1. 启动appium服务,其实是appium启动了一个http接口,默认端口号是4723
  2. 脚本向appium发送以下请求
//POST  /wd/hub/session ,参数如下(举例)
//包含安装包以及手机设备信息等
{
   "desiredCapabilities": {
       "unicodeKeyboard": true, 
       "deviceName": "D8YDU16325002121", 
       "newCommandTimeout": "120", 
       "noReset": false, 
       "resetKeyboard": true, 
       "appPackage": "com.boyaa.lordland.sina", 
       "platformName": "Android", 
       "appActivity": "com.boyaa.lordland.sina.Game"
   }
}
  1. appium server 接收到脚本请求后,如何与设备建立通信

再此过程中,,appium-server充当客户端,netty server充当服务端
详细流程如下:

  • appium启动脚本开始执行后,首先会进行一系列初始化操作(这里在启动appium示打出log,可以进一步分析),如上图示,主要如下行为:
  1. 使用adb命令安装辅助工具appium-setting到手机设备上(appium本地安装包路径下有appium-setting的安装包,npm_modules/node_modules/appium/node_modules/io.appium.setting/apks)
  2. 使用adb命令安装辅助工具uiautomator2.server和uiautomator2.server.test到手机设备上(ppium本地安装包路径下有uiautomator2.server和uiautomator2.server.test的安装包,ode_modules/appium/node_modules/appium-uiautomator2.server/apks)
    作用解释:
  • uiautomator2.server一个是驱动模块,负责创建会话session
  • appium调用Android Driver 为客户端生成一个session 仅在第一次请求时,且有对应的sessionid(代表打开的设备),且将sessionid返回给客户端并保存,再次访问携带作为唯一标识,关闭Driver(driver.quit()) 示session生命周期结束
  • uiautomator2.server.test是服务器模块,当驱动模块初始化完成,监听appium服务发送的请求,将请求发送给真正底层的UiAutomator2
  1. 第二步完成,检测到uiautomator2.server.test服务可用
  2. 端口映射,forwarding System:8200 to devices 6790,即当电脑上的8200端口收到请求会转发到手机的6790端口
    解释:
  • 8200是appium在电脑上占用的端口,主要为了和手机做端口映射
  • 6790是手机设备上启动uiautomator2占用的端口
  1. 启动手机上的uiautomator2.server.test,会创建一个netty server(对socket进一步封装,比socket高级的通讯框架),该netty server端口号就是6790,用来操作待测app
    解释:
  • 初始化完成 至此,AppiumDriver 启动成功,会话创建完成,打开app;
  • 日志如示:[HTTP]<-- POST /wd/hub/session 500 65473 ms - 1421
[服务器会生成唯一session,随后调用相关方法生成sessionId,用来标识session对象。同时会把sessionId返回给客户端(脚本)保存,之后每次请求都会携带sessionId]
注:可以在appium执行完后控制台log如下:
[Appium] New AndroidDriver session created successfully, session a942b672-b86d-44a4-bd46-14a6cd516f11 added to master session list
[debug] [BaseDriver] Event ‘newSessionStarted’ logged at 1515135795839 (15:03:15 GMT+0800 (中国标准时间))
  1. 执行测试脚本如以下:
例如,脚本中查找元素,完成点击操作:
driver.find_element_by_id(‘com.android.calculator2:id/digit1’).click()
控制台可以看到 ,脚本向服务发送请求
(1)POST /wd/hub/session/{sessionId}/element {"using":"id","sessionId":"xxxxxxxxxx","value":"com.android.calculator2:id/digit1"}发送了post请求,调用的是AppiumDriver.findElement方法,返回找到该元素的id,比如:{"ELEMENT":"1"};

(2) 上面查找到的请求返回的id ,会作为参数进行传递,脚本再次想服务器发送请求
POST   /wd/hub/session/{sessionId}/element/1/click ,这里的1就是上个步骤返回的该元素的id;

(3)在手机端的点击成功后,返回{“value”:true, “status”:0},最终返回 到客户端就是true,至此完成整个流程;

Appium1.13版本之前

UIAutomation对比appium_客户端_06


主要区别:

1.端口映射有差异(4724端口作为appium在电脑上占用的端口,主要为了和手机做端口映射

4724是手机设备上启动uiautomator1占用的端口)

2.执行引擎不同,adb命令在手机设备上安装
appiumbootstrap.jar---->中间件
【Bootstrap是Appium在初始化的时候推送到安卓手机上的一个UiAutomator测试脚本,脚本作用:在手机端开启一个SocketServer(通讯模块),用来监听Appium服务发过来的命令发送给UiAutomator来执行处理】
(adb shell 进入终端下/data/local/tmp路径存在有该jar,appium执行后生成的),用以操作待测app;

3.启动appiumbootstrap.jar,在设备上创建socket服务
appium-server 和手机设备建立通信;
4.appiumbootstrap监听到4724端口由appium发送过来的相关请求,将请求转换成UiAutomator1能够识别的命令发给UiAutomator1进行处理;

除上述之外,原理基本和Appium1.13以后的版本一致;