Appium - 运行原理
简介
Appium 是一个移动端自动化测试框架,可用于测试:
- 原生应用:安卓或 iOS 应用
- 移动网页应用:网页应用,h5,safari 或者手机 chrome
- 混合应用:原生应用嵌套 webview
支持跨平台,底层多引擎可切换,生态丰富,社区强大。
概念
客户端 / 服务器 架构
Appium 的核心一个是暴露 REST API 的 WEB 服务器。它接受来自客户端的连接,监听命令并发送指令到移动设备上执行,返回 HTTP 响应来描述执行结果。
Appium 客户端
客户端程序库,各种语言实现的 Appium-client API,是 Appium 对 WebDriver 协议的扩展。这些库封装了标准的 Selenium 客户端,提供了所有 JSON Wire protocol 指定的常规 selenium 命令,并额外添加操控移动设备相关的命令,例如 多点触控手势 和 屏幕方向。
Appium 服务器
Appium 是一个用 Node.js 写的服务器,可以放在本机,也可以放在云端。主要负责两件事情:
-
默认开启
4723端口,监听来自客户端的HTTP请求 -
本地开启
4724端口,将请求转发给移动端
预期能力(Desired Capabilities)
它告诉服务器我们想要启动什么类型的自动化会话,本质上是一个 key-value 形式的对象。脚本通过请求以 json 格式发送测试设备信息给服务端,服务端来完成该类型会话的创建。
会话(Session)
自动化测试始终在一个会话的上下文中执行,客户端程序库以各自的方式发起与服务器的会话,但最终都会发给服务器一个 POST /session 请求,请求中包含一个被称作「预期能力」的 JSON 对象。这时服务器就会开启这个自动化会话,并返回一个用于发送后续命令的会话 ID。
Session 对象存储特定用户会话所需的属性及配置信息,对应到这里其实就是 Desired Capabilities 中的配置信息参数。
Appium 界面版本,打包了 Appium 服务器运行需要的所有东西。提供 Inspector 查看应用程序的层级结构。
各平台测试引擎列表:
- iOS 9.3 及以上: 苹果的 XCUITest
- iOS 9.3 及以下: 苹果的 UIAutomation
- Android 4.3+: 谷歌的 UiAutomator / UiAutomator2
- Android 2.3+: 谷歌的 Instrumentation
- Windows: 微软的 WinAppDriver
框架介绍
客户端发送请求到服务端,服务端将请求转为可执行指令发送到设备,执行操作后返回结果。

以 Android 端为例
- 启动
Appium Server,监听4723端口的请求; - 运行代码,
client向server发送带有设备信息的HTTP请求,server监听到该设备信息; - 初始化移动设备,安装
bootstrap.jar并自动开启设备的4724端口; server开启4724端口用于和bootstrap.jar通信,等待客户端连接;server根据监听到的client请求生成对应的自动化会话,并返回SessionID给client;client将脚本转化为请求并携带SessionID发送给server;server将请求解析后,通过4724端口转发给bootstrap.jar,这时的Appium server转变为客户端;bootstrap.jar将请求信息转化为uiautomator指令,让uiautomator进行处理并执行;- 执行后的请求响应原路返回给脚本,脚本再进行下一次的请求;
- 代码执行
quit后,关闭session和进程,测试结束。
Appium Server 作为服务端,同时也是客户端,是一个双向通信连接实现数据交换的过程。
总体来说,Appium Server 既扮演着 server 的角色又扮演着 client 角色。
当它面对代码脚本的时候是一个 server,接收脚本发送的请求指令;
当它面对在终端设备上部署的原生代理(Android -> bootstrap.jar | iOS -> wda)时又是一个client,把接收到的网络指令以规定的形式发出去,不同平台的代理将请求解析为原生语言指令,通过原生测试框架操作 APP,这就是 appium 实现跨平台的方式。
环境安装
- java 1.8+
- Android SDK
- Node. js (>=10)、npm(>=6)
- python3
- appium-desktop(非必须)
- appium-python-client
Appium Server 是 node.js 写的,必须先安装 node
# 安装 appium
$ npm install -g appium
$ appium
# 安装 python client
$ pip install Appium-Python-Client
验证环境是否正常。
from appium import webdriver
desired_caps = {
'platformName': 'Android',
'platformVersion': '10.0',
'deviceName': 'Android Emulator',
'appPackage': "com.android.settings",
"appActivity": ".HWSettings"
}
driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)
driver.quit()

浙公网安备 33010602011771号