第十八篇:《移动端UI自动化:Appium入门实战》

移动端(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。

混合应用中注意切换上下文。

相关推荐
罗西的思考2 小时前
【GUI-Agent】阿里通义MAI-UI 代码阅读(1)— 总体
人工智能·机器学习·ui·transformer
码途漫谈2 小时前
UI-UX-Pro-Max开源项目介绍
人工智能·ui·ai·开源·ai编程·ux
比特 GOK3 小时前
Qt项目ui文件中新添加的控件在代码中不识别的问题解决
开发语言·qt·ui
TTGGGFF6 小时前
自动化天塌了?AI 替你画 Simulink!Agent——MCP 配置踩坑指南(附真实环境实测)
人工智能·自动化·simulink
倔强的石头1067 小时前
kingbase备份与恢复实战(六)—— 备份自动化与保留策略:Windows任务计划+日志追溯
运维·windows·自动化
HAPPY酷9 小时前
[UE5 避坑指南] 为什么打包后 UI 消失了?Launch Game 与强制加载
java·ui·ue5
周bro10 小时前
vue2+element ui 中的el-table表格 选中当前行当前行变色,单选/多选--------续集:表格样式修改整合
vue.js·ui·elementui
DFT计算杂谈1 天前
自动化脚本一键绘制三元化合物相图
java·运维·服务器·开发语言·前端·python·自动化
ZC跨境爬虫1 天前
跟着 MDN 学 HTML day_17:媒体与 Web Audio API 自动播放指南——策略、检测与最佳实践
前端·笔记·ui·html·音视频·媒体