Appium 是一个跨平台框架,用于自动化测试移动、Web 和桌面应用程序,基于 WebDriver 协议。它允许使用任何编程语言编写测试,并在 Android、iOS 和 Windows 上运行而无需修改代码。根据 Appium Foundation, 2025 的数据,WebDriver 协议为在不同平台上与应用程序交互提供了统一接口。
要点
Appium 是一个开源框架,用于自动化移动应用程序测试,基于客户端-服务器架构。Appium 服务器通过 WebDriver 协议从客户端接收命令,并将其委派给原生驱动程序:iOS 使用 XCUITest,Android 使用 UiAutomator2,Windows 使用 WinAppDriver。
Appium 创建于 2013 年,从此成为跨平台测试的行业标准。该项目由 Appium Foundation 管理,并得到大公司的支持:Sauce Labs、HeadSpin、Microsoft。全球每月有超过 50 万测试人员使用 Appium。
Appium 支持三种类型的应用程序:原生(iOS、Android、Windows)、移动 Web 浏览器(Safari、Chrome)和混合应用程序(原生外壳内的 WebView)。每种类型使用自己的上下文:NATIVE_APP、WEBVIEW 或 CHROMIUM。
Appium 架构由四层组成:客户端代码 → Appium Client Library → Appium Server → 原生驱动程序。客户端库实现了 WebDriver 协议,并向服务器发送 HTTP 请求。服务器将其转换为平台原生驱动程序的命令。
WebDriver 是 W3C 的浏览器自动化标准,由 Appium 针对移动设备进行了适配。每个操作 — 查找元素、点击、输入文本 — 都作为 HTTP 请求发送到服务器。例如,POST /session/{id}/element 创建一个新的测试会话。
每个测试都通过 Desired Capabilities 对象创建会话开始。其中指定:platformName、deviceName、appPath、automationName 和其他参数。Appium 使用这些数据来选择适当的原生驱动程序并配置设备。
# Android 的 Desired Capabilities 示例
desired_caps = {
'platformName': 'Android',
'deviceName': 'Pixel_4',
'app': '/path/to/app.apk',
'automationName': 'UiAutomator2',
'appPackage': 'com.example.app',
'appActivity': '.MainActivity'
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
通过 npm 安装 Appium:npm install -g appium。安装后,需要为每个平台配置原生驱动程序:appium driver install xcuitest 和 appium driver install uiautomator2。使用 iOS 需要 Xcode,Android 需要 Android SDK。
Appium Inspector 是一个用于检查界面元素的图形工具。它连接到正在运行的 Appium 服务器,并显示 UI 组件的层次结构、它们的属性和定位器。Inspector 允许在编写测试之前检查选择器。
Appium 服务器使用 appium 命令启动,带有可选参数:端口、地址、日志记录。默认情况下,服务器监听端口 4723。为了并行运行多个设备,使用不同的端口或 Appium 集群。
# 带日志记录的 Appium 服务器启动
appium \
--port 4723 \
--log-level debug \
--use-plugins images \
--base-path /wd/hub
Appium 测试使用 Page Object 模式组织代码。应用程序的每个屏幕都由一个单独的类描述,包含元素定位器和交互方法。Page Object 模型简化了界面变化时测试的维护,并在测试场景之间重用选择器。
Appium 支持多种元素查找策略:id、xpath、accessibilityId、className、androidUIAutomator 和 iOSClassChain。最推荐的是 accessibilityId 和 id — 它们在布局变化时保持稳定。XPath 仅应在没有其他定位器时使用。
// 登录界面的 Page Object
public class LoginPage {
private AppiumDriver driver;
private MobileElement emailField =
(MobileElement) driver.findElement(MobileBy.AccessibilityId("emailInput"));
private MobileElement passwordField =
(MobileElement) driver.findElement(MobileBy.AccessibilityId("passwordInput"));
private MobileElement loginButton =
(MobileElement) driver.findElement(MobileBy.AccessibilityId("loginButton"));
public void login(String email, String password) {
emailField.sendKeys(email);
passwordField.sendKeys(password);
loginButton.click();
}
}
Appium 通过 TouchAction 类或 W3C Actions API 支持复杂手势:滑动、多点触控、长按、滚动到元素。建议新项目使用新的 W3C Actions API,因为它是标准化的,并且在不同的平台版本上更稳定地工作。
Appium 经常与 Detox、XCUITest 和 Espresso 进行比较。Appium 的主要优势是跨平台能力:一个测试可以在 iOS 和 Android 上运行而无需修改。然而,Detox 为 React Native 提供更好的同步,而 XCUITest/Espresso 为原生测试提供更快的执行速度。
Appium 适用于需要为 iOS、Android 和 Web 提供统一框架的项目。对于使用 Java 或 Python 编写测试的团队来说不可或缺。对于有大量 E2E 测试的 React Native 项目,由于自动同步,最好考虑 Detox。
| 框架 | 方法 | 速度 | 跨平台 |
|---|---|---|---|
| Appium | 黑盒 | 中等 | iOS、Android、Windows |
| Detox | 灰盒 | 高 | iOS + Android(React Native) |
| XCUITest | 白盒 | 高 | 仅 iOS |
Appium Grid 是一个扩展,用于同时在多个设备上并行运行测试。Appium Grid 基于 Selenium Grid 构建,允许在多个 Appium 服务器之间分配测试,每个服务器管理自己的设备或模拟器集合。这对于大型项目至关重要,因为单台设备上的回归测试需要数小时 — Grid 将时间按节点比例缩短到分钟。
配置 Grid 使用 JSON 格式的配置文件,其中描述了带设备的节点。每个节点指定:服务器端口、带平台的设备列表、操作系统版本和最大会话数。Hub 将测试分发到空闲节点,确保基础设施的最大利用率。
{
"capabilities": [
{
"browserName": "android",
"platformName": "Android",
"deviceName": "Pixel_4",
"platformVersion": "14.0",
"maxInstances": 2
}
],
"configuration": {
"port": 4724,
"registerCycle": 5000
}
}
如果自己的设备基础设施不可用,可以使用云服务:Sauce Labs、BrowserStack、LambdaTest。它们在云端提供数百个真实设备和模拟器。与 Appium 的集成非常简单:只需在 Desired Capabilities 中指定云端 hub 的 URL 和凭据,而不是 localhost。
Appium 支持使用 TestNG(Java)或 pytest-xdist(Python)进行并行测试执行。并行化需要为每个会话提供唯一的端口和隔离的测试数据。每个线程在单独的设备或模拟器上启动自己的 Appium 会话。使用云服务时,并行化是自动的 — 平台自行将测试分发到可用设备,并在完成后释放它们。
遇到 Appium 问题时,第一步是检查服务器日志(appium --log-level debug)。典型错误:端口被占用(指定其他 --port)、驱动程序版本不兼容、缺少 Android SDK 或 Xcode。对于 iOS,请确保 WebKitAgent 正在运行并且可以访问模拟器。
如果 Appium 找不到元素,请检查:上下文是否正确(NATIVE_APP vs WEBVIEW)、元素在屏幕上是否可见、是否需要滚动以及定位器是否正确。在插入测试之前,使用 Appium Inspector 进行交互式搜索和检查 XPath 表达式。此外,通过 WebDriverWait 启用等待元素出现也很有用 — 这解决了 UI 加载缓慢时的同步问题。
会话的不正确结束是 Appium 测试不稳定的常见原因。始终在 finally 块中或通过 AutoCloseable 关闭驱动程序。发生错误时,使用强制 driver.quit()。对于 iOS,请确保 WebKitAgent(WDA)在会话之间重启,否则可能会出现 session not created 错误。为了在 CI 中监控会话状态,连接 Appium Dashboard 插件很有用,它可以实时可视化所有正在运行的测试的状态。
为了提高测试稳定性,请使用:shouldTerminateApp(在测试之间关闭应用程序)、noReset(在会话之间保留数据)、autoGrantPermissions(自动授予系统对话框权限)。还建议通过 Developer Options 在设备上禁用动画。
常见问题
Appium 通过客户端库支持所有流行语言:Java、Python、JavaScript、Ruby、C#、PHP 和 Kotlin。每个库实现相同的 WebDriver 协议,允许用任何语言编写跨平台测试。
不需要,Appium 既可以在真实设备上运行,也可以在模拟器和仿真器上运行。Android 使用 Android Studio 模拟器,iOS 使用 Xcode 仿真器。真实设备仅用于测试硬件功能:传感器、NFC、摄像头。
Appium 2 使用模块化架构完全重写,包含插件和单独的驱动程序。在 Appium 1 中,所有驱动程序都内置于服务器中。Appium 2 使用 appium driver install 命令安装驱动程序,使用 appium plugin install 命令安装插件。
Appium 使用搜索策略:By.id、By.xpath、By.accessibilityId、By.className、By.androidUIAutomator 和 By.iOSClassChain。为了速度,建议使用 accessibilityId — 它稳定且不依赖布局变化。
可以,Appium 支持测试移动浏览器 — iOS 上的 Safari 和 Android 上的 Chrome。为此使用 WEBVIEW 或 CHROMIUM 上下文。测试通过标准 WebDriver 在浏览器中运行,类似于 Selenium。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。