Appium入坑指南——Appium原理分析

架构图

Appium架构图

Appium架构图-2

主要原理

  1. Appium Client

    主要是指实现了Appium功能的WebDriver协议的客户端Library,它负责与Appium服务器建立连接(JSON Wire Protocol),并将测试脚本的指令发送到Appium服务器。正如官网中文版介绍一样,它支持多种语言的客户端。

  2. Bootstrap.jar

    Bootstrap是Appium运行在目标测试机器上的一个UiAutomator测试脚本,该脚本的唯一一个测试方法所做的事情是在目标机器开启一个socket服务器来把一个session中Appium从PC端过来的命令发送给UiAutomator来执行处理。这个定义说明了Bootstrap在appium和uiautomator中究竟处于一个什么样的角色:
    首先,它是一个uiautomator的测试脚本,它的入口类Bootstrap继承于UiAutomatorTestCase,所以UiAututomator可以正常运行它,它也可以正常的使用uiautomator的方法,这个就是Appium的命令可以转换成uiautomator的命令的关键
    其次,它是一个socket服务器,它专门监听4724端口过来的appium的连接和命令数据,并把appium的命令转换成uiautomator的命令来让uiautomator进行处理
    最后,它处理的是appium从pc端过来的命令,而非一个文件。这在初次接触appium的朋友是很容易困惑的,以为appium是整个脚本文件发送到目标机器再由bootstrap进行分析处理的,事实并非如此

  3. Appium Server

    Appium服务器是Appium框架的核心。它是一个基于Node.js实现的HTTP服务器。Appium服务器的主要功能是起了一个Server(4723端口),跟selenium WebDriver测试框架类似,Appium支持标准的WebDriver JSONWireProtocol。Appium Server接收web driver标准请求,解析请求内容,调用对应的框架响应操作。将命令发送给bootstrap.jar(iOS手机为bootstrap.js)执行,并将命令的执行结果通过HTTP应答反馈给Appium客户端。

结论

Appium在Android上基于UIAutomator实现了测试的代理程序(Bootstrap.jar),在iOS上基于UIAutomation实现了测试的代理程序(Bootstrap.js)。当测试脚本运行时,每行WebDriver的脚本都将转换成Appium的指令发送给Appium服务器,而Appium服务器将测试指令交给代理程序,将由代理程序负责执行测试。比如脚本上的一个点击操作,在Appium服务器上都是touch指令,当指令发送到Android系统上时,Android系统上的Bootstrap.jar将调用UIAutomator的方法实现点击操作;而当指令发送到iOS系统上时,iOS的Bootstrap.js将调用UIAutomation的方法实现点击操作。由于Appium有了这样的能力,同样的测试脚本可以实现跨平台运行。

参考资料

https://www.jianshu.com/p/06aa73eb9b90

https://testerhome.com/topics/1972

https://discuss.appium.io/t/what-is-working-on-android-side/10222/2