Appium-Uiautomator2-Server 之原理分析


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安装到测试设备上
    1. io.appium.uiautomator2.server.apk,执行handlers
    2. io.appium.uiautomator2.server.test.apk,只有一个test,用于启动server
      1. AppiumServlet ,管理请求的路由,将driver发过来的请求转发给对应Handler
      2. Handler,调用UiAutomator V2去执行指定操作,操作的结果经AppiumResponse统一封装
      3. 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收到指令后回去完成点击,滑动其他的操作

  完成之后再通过服务,给服务端一个相应。服务端收到之后再去响应脚本

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM