一、工具介绍
1、Appium是什么
Appium是一个开源、跨平台的测试框架,可以用来测试安卓、ios、FirefoxOS平台上的原生及混合的移动端应用。
在安卓端里Appium是基于WebDriver协议进行通信,将具体的元素操作命令转发给io.appium.uiautomator2.server,驱动输入UiAutomator2的命令,实现App的自动化测试。
2、Appium组成
Appium架构分三部分组成:Appium-Client、Appiu-Server、Devices

Appium-Client:我们所编写的自动化测试脚本,发送请求给Appium-Server,请求内容包括对Appium进行初始化、APP进行相应操作、对用例执行结果进行断言;
Appiu-Server:负责接收Appium-Client的请求,进行解析,并根据测试平台的不同,调用对应的框架(安卓:UiAutomator2、ios:UI Automation),将操作指令发送给测试设备;
Devices:测试设备,可以是虚拟机,也可以是真机,如安卓,Appium初始化时,会向手机部署io.appium.uiautomator2.server包、io.appium.uiautomator2.server.test包,监听Appium-Server端的命令,并调用UiAutomator2,执行相应的操作,并返回执行结果;
3、准备工作
①appium库的下载
pycharm的项目配置可以下载Appium-Python

②测试脚本中AppiumClient的引入
![]()
③安卓环境的搭建
java、Android SDK的安装
④测试用例的编写

以上代码的作用:打开雪球APP,定位到首页的消息按钮,点击进入后,退出APP,打印用例执行过程中的sessionID

⑤AppiumServer服务的启用

⑥用例的执行

二、用例执行流程
1、工作流
1、测试脚本运行时,会通过发起一个HTTP请求,在请求body中传递desired capabilities给AppiumServer来创建一个session, AppiumServer根据automationName去启动对应的drive
2、AppiumServer:
①创建会话的请求,将接收到AppiumClient发送的desired capabilities,进行driver初始化,完成一系列的准备工作,并返回结果给AppiumClient。:
如desired capabilities中,设置的automationName为UIAutomator2,appium会调用appium-uiautomator2-driver,同时将uiautomator2 server的两个apk安装到测试设备上
io.appium.uiautomator2.server.apk,执行handlers
io.appium.uiautomator2.server.test.apk,只有一个test,用于启动server
②元素定位、操作等请求,将接收到AppiumClient发送的element/click等请求转发给io.appium.uiautomator2.server,驱动uiautomator2的命令去执行相应的操作,并检查命令的执行结果,返回结果给AppiumClient。

2、一个实例
Appium服务可部署在本地或者远程机器上,默认监听端口4723,与测试脚本是基于Json Wire协议进行通信的,本质就是一个REST风格的post请求;
用例执行时,需要先进行Appium初始化、创建会话;
1)测试代码:
该用例执行步骤:启动APP、定位对应的元素、元素的点击、退出测试;

2)创建会话的请求:
①对应代码

②Appium-Client与Appium-Server交互
测试脚本发送对应的请求给AppiumServer,AppiumServer进行初始化完成后,会返回sessioId,且该sessionId会用于下一个请求;

③AppiumServer初始化过程



AppiumServer向设备端的appium-server发送一个获取状态的请求,确认在设备端的Appium scoket server是正确的,发送端口是AppiumServer的8204,会设备端的6790端口


AppiumClient获取到sessionId后,保存该sessionId,并在下次请求时带上该sessionId;
3)元素定位并点击:
①对应代码

②Appium-Client与Appium-Server交互
查找元素请求body中,定义元素查找的方式为根据ID查找,返回该元素信息

③AppiumServer元素查找执行过程
定位成功后,AppiumServer返回元素

④元素点击操作请求,返回操作结果

⑤AppiumServer元素点击过程

4)结束测试
①对应代码

②Appium-Client与Appium-Server交互
AppiumClient发送了一个DELETE请求给AppiumServer,AppiumServer发送关闭所有自动化开启的端口的命令给测试设备

③AppiumServer执行过程

3、整体流程
用例的执行过程,涉及:Appium-Client与Appium-Server、Appium-Server与安卓设备、设备间的通信,整体流程如下

三、相关知识
1、session
Session在计算机中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息,对应到这里其实就是desiredCapabilities中的配置信息参数。脚本通过POST /session这个URL,然后传入Desired Capabilities就可以开启session了,由于这是第一次请求创建session,所有并没有一个已创建的session id,所以appium server会调用android driver为client生成一个session并且生成一个与此session相关联的session id,这个 session id将被在本次响应中返回给客户端保存,当下次脚本发出操作请求时就会自带session id为唯一标识,代表所打开的设备,Appium server会按照此session id把这个session检索出来使用,脚本向appium server发送的请求即是存在于创建的session中的。
当测试结束后,需关闭webdriver,driver.quit()会关闭所有关联窗口和session,并且也会把进程也关闭。
2、UiAutomator2
UiAutomator2是Google提供的用来做安卓自动化测试的一个Java库,可以对第三方App进行测试。Appium自动化的本质,是驱动UiAutomator2执行相应的命令,完成自动化操作。