Appium框架
- appium工作引擎是第三方的自动化测试框架;appium把这些第三方的测试框架封装成一套api,即webdriver api;appium基于webdriver协议,添加了移动端自动化相关api
- appium的整体架构是C/S模式,整体流程基于webdriver(返回顺序为逆向):
appium-uiautomator-server
Appium的通信过程
appium三大核心:
- appium服务器:会首先开启一个监听4723端口的server,接收测试脚本发送过来的对应请求,再将对应的请求发送给中间件Bootstrap.jar(注意这里的请求不是整个脚本文件,而是对应的命令请求,比如:点击一个元素就是一条请求)
- 设备:监听4724端口由appium发送过来的相关请求,并且将请求转换成UiAutomator可以识别的命令发给UiAutomator进行处理
- 脚本:WebDriver script:我们的测试脚本(java or python)
bootstrap介绍
1)Bootstrap作用:
Bootstrap是Appium在初始化的时候推送到安卓手机上的一个UiAutomator测试脚本,该脚本的唯一一个测试方法所做的事情是在手机端开启一个SocketServer(通信模块),用来监听Appium的4724端口从PC端过来的命令发送给UiAutomator来执行处理
2)Bootstrap在appium中扮演的角***r>创建session成功之前,就已将bootstrap.jar放入手机中,并开启设备上的基于appium bootstrap的socket服务,绑定本机和boostrap通信的端口号4724用于和Android设备通讯,默认监听4724端口,等待client的连接。
Appium server将脚本的请求解析后给到4724端口,通过设备的4724端口转发解析后的请求, 此时,对于socket服务来说,appium server就充当了client的角色,appium server通过4724端口主动去请求设备上的socket服务,即向socket服务发送请求,即bootstrap.jar,Bootstrap.jar再把Appium的命令转换成uiautomator的命令来让uiautomator进行处理。有请求就有返回,socket接收到请求后会做出响应,原路返回给脚本,然后脚本再进行下一次的请求。
其次,bootstrap是一个socket服务器,专门监听4724端口过来的appium的连接和命令数据,并把appium的命令转换成uiautomator的命令来让uiautomator进行处理;
最后,bootstrap处理的是从pc端过来的命令,而非一个文件。
3)架构及实现原理
Android架构图
ios架构图
注:appium ios封装了apple的 Instruments框架,主要用了Instrument里的UI Automation(Apple的⾃自动化测试框架),然后在设备中注⼊入bootstrap.js进⾏行监听
iOS原理图
客户端、appium、设备通信过程图解
session的创建流程图解:
appium-uiautomator2-server
原理说明:
- 客户端通过脚本的HTTP请求方式访问appium server的启动端口(默认4723)
- appium接收到客户端的请求后,appium server根据automationName去启动对应的driver,默认是android-driver。若automationName设为UIAutomator2,appium会调用appium-uiautomator2-driver,同时将uiautomator2 server的两个apk安装到测试设备上
- io.appium.uiautomator2.server.apk,执行handlers
- io.appium.uiautomator2.server.test.apk,只有一个test,用于启动server
- AppiumServlet ,管理请求的路由,将driver发过来的请求转发给对应Handler.
- Handler,调用UiAutomator V2去执行指定操作,操作的结果经AppiumResponse统一封装
- AppiumResponse,操作结果返回给appium-uiautomator2-driver,再将结果返给客户端
3.通过步骤1,2,在客户端创建session成功,客户端可post command,命令 经过appium server转发给netty server后,将传递过来的appium命令转化成uiautomator,然后驱动uiautomator框架在设备操作,获得结果后通过appium server返回给客户端。
appium server根据automationName去启动对应的driver,默认是android-driver。
若automationName设为UIAutomator2,appium会调用appium-uiautomator2-driver,同时将uiautomator2 server的两个apk安装到测试设备上
uiautomator v1与v2的区别:
- appium只有在uiautomator2下可以实现对toast的识别,那是因为Google新增了AccessibilityService服务,重写该服务可以实现对Notification和Toast内容的捕捉
- 通信模块使用了Netty Server,较之bootstrap使用的ServerSocket,Netty是一个高性能、异步驱动的NIO框架,占用内存少,性能更好。
- UiAutomator2修复了v1中遇到的大多数问题,最重要的是实现了与Android系统更新的分离
参考文章:
https://www.jianshu.com/p/30b3b2d6b901
https://blog.csdn.net/jffhy2017/java/article/details/69220719
https://www.jianshu.com/p/71ab7fe2988c
https://www.jianshu.com/p/d8457a06c7b7