移动端(Android/iOS)的自动化测试是Web测试的自然延伸。Appium 是最流行的开源移动端自动化框架,它沿用了WebDriver协议,支持多语言、跨平台(Android/iOS)。本文将带你搭建Appium环境,编写第一个Android测试脚本,并分享真机/模拟器的调试技巧。
一、Appium 核心概念
Appium 是一个 C/S 架构的测试工具:
Appium Server:用 Node.js 编写,接收标准 WebDriver 命令,翻译成移动端底层指令(Android 用 UiAutomator2 或 Espresso,iOS 用 XCUITest)。
客户端:使用 Selenium 客户端库发送请求到 Appium Server。
支持平台:
Android(4.3+,推荐 UiAutomator2)
iOS(9.3+,推荐 XCUITest)
Windows(部分支持)
工作流程:测试脚本 → Appium Server → 手机/模拟器上的应用 → 返回结果。
二、环境搭建(以 Android 为例)
2.1 必备工具
Android Studio(包含 Android SDK)
Java JDK 8 或 11
Node.js(用于运行 Appium Server)
Appium Server(可通过 npm 安装或使用 Appium Desktop)
Appium 客户端库(如 Java Client、Python Client)
Android 模拟器或真机
安装 Appium Server:
bash
npm install -g appium
启动服务器:
bash
appium
# 或带日志级别
appium --log-level debug
2.2 配置 Android 环境变量
在 ~/.bashrc 或系统环境变量中添加:
bash
export ANDROID_HOME=/Users/xxx/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:$ANDROID_HOME/tools
验证:
bash
adb devices # 列出连接的设备
2.3 准备被测应用
一个 .apk 文件(Android 安装包)
或已安装的应用(通过包名和 Activity 启动)
2.4 Appium 客户端依赖(Java + Maven)
xml
<dependency>
<groupId>io.appium</groupId>
<artifactId>java-client</artifactId>
<version>8.5.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.15.0</version>
</dependency>
三、第一个 Android 测试脚本
3.1 启动模拟器/连接真机
模拟器:通过 Android Studio AVD Manager 创建并启动。
真机:开启 USB 调试,通过 USB 连接,adb devices 确认设备已授权。
3.2 编写脚本(Java)
java
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.options.UiAutomator2Options;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import java.net.MalformedURLException;
import java.net.URL;
import java.time.Duration;
public class FirstAndroidTest {
public static void main(String[] args) throws MalformedURLException {
// 设置选项
UiAutomator2Options options = new UiAutomator2Options()
.setPlatformName("Android")
.setDeviceName("emulator-5554") // 从 adb devices 获得
.setApp("/path/to/app-debug.apk") // 本地 apk 路径
// 或者使用已安装的应用
// .setAppPackage("com.example.myapp")
// .setAppActivity(".MainActivity")
.setAutomationName("UiAutomator2")
.setNoReset(false); // 是否重置应用状态
// 连接到 Appium Server
AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723"), options);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
// 操作元素(与 Web 类似)
WebElement el = driver.findElement(By.id("com.example:id/username"));
el.sendKeys("testuser");
driver.findElement(By.xpath("//android.widget.Button[@text='登录']")).click();
String result = driver.findElement(By.id("com.example:id/welcome")).getText();
System.out.println("结果:" + result);
driver.quit();
}
}
3.3 Python 版本
python
from appium import webdriver
from appium.options.android import UiAutomator2Options
from selenium.webdriver.common.by import By
options = UiAutomator2Options()
options.platform_name = "Android"
options.device_name = "emulator-5554"
options.app = "/path/to/app.apk"
driver = webdriver.Remote("http://127.0.0.1:4723", options=options)
driver.implicitly_wait(10)
driver.find_element(By.ID, "com.example:id/username").send_keys("testuser")
driver.find_element(By.XPATH, "//android.widget.Button[@text='登录']").click()
print(driver.find_element(By.ID, "com.example:id/welcome").text)
driver.quit()
四、元素定位技巧
4.1 Android 常用定位方式

4.2 使用 Appium Inspector 定位
Appium Inspector 是一个图形化工具,可以连接设备,显示 UI 树,帮助你快速生成定位器。从 Appium Desktop 启动或使用独立版本。
五、常用操作
5.1 滑动与手势
Java:
java
// 滑动屏幕 (起始x,y -> 结束x,y)
driver.swipe(500, 1500, 500, 500, 500); // 向上滑动
// TouchAction(功能更强大)
TouchAction action = new TouchAction(driver);
action.press(PointOption.point(500, 1500))
.waitAction(WaitOptions.waitOptions(Duration.ofMillis(200)))
.moveTo(PointOption.point(500, 500))
.release()
.perform();
Python:
python
driver.swipe(500, 1500, 500, 500, 500)
# 使用 TouchAction
from appium.webdriver.common.touch_action import TouchAction
TouchAction(driver).press(x=500, y=1500).wait(200).move_to(x=500, y=500).release().perform()
5.2 多点触控
java
// 双指缩放
driver.zoom(element); // 放大
driver.pinch(element); // 缩小
5.3 处理上下文(原生/WebView混合)
App 内嵌 WebView(如 H5 页面)时,需要切换上下文:
java
// 获取所有上下文
Set<String> contexts = driver.getContextHandles();
for (String ctx : contexts) {
if (ctx.contains("WEBVIEW")) {
driver.context(ctx); // 切换到 WebView
// 使用 WebDriver 方法操作 Web 元素
driver.findElement(By.cssSelector(".submit")).click();
driver.context("NATIVE_APP"); // 切回原生
break;
}
}
六、iOS 测试简介
iOS 需要 Mac + Xcode。流程类似,但使用 XCUITestOptions:
java
XCUITestOptions options = new XCUITestOptions()
.setPlatformName("iOS")
.setDeviceName("iPhone 14 Pro")
.setApp("/path/to/app.app");
注意:iOS 真机需要配置开发者证书,且 Appium 需通过 WebDriverAgent 签名安装。
七、常见问题与解决方案

八、与 Web 测试框架整合
可以将 Appium 集成到已有的 TestNG/JUnit 框架中,通过配置选择平台:
java
public class MobileBaseTest {
protected AndroidDriver driver;
@BeforeMethod
public void setUp() throws MalformedURLException {
String platform = ConfigReader.getPlatform(); // "android" or "ios"
if ("android".equals(platform)) {
driver = new AndroidDriver(new URL("http://localhost:4723"), getAndroidOptions());
} else {
driver = new IOSDriver(new URL("http://localhost:4723"), getIOSOptions());
}
}
}
九、总结
核心要点:
Appium 基于 WebDriver 协议,学习成本低。
Android 推荐使用 UiAutomator2,iOS 使用 XCUITest。
元素定位与 Web 类似,但需借助 Appium Inspector。
混合应用中注意切换上下文。