第十八篇:《移动端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。

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

相关推荐
laowangpython4 天前
Photoshop 2025 下载安装全攻略
其他·ui·photoshop
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉4 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
dayuOK63074 天前
写作卡壳怎么办?我的“5分钟启动法”
人工智能·职场和发展·自动化·新媒体运营·媒体
风华圆舞4 天前
Flutter + 鸿蒙 Intents Kit:页面直达能力的完整接入方案
flutter·ui·华为·harmonyos
鲲穹AI超级员工4 天前
多款实用配色工具汇总,适配设计、UI 创作等多元场景
ui·色彩设计
志栋智能4 天前
超自动化巡检:如何选择适合你的起点?
运维·自动化
HackTwoHub4 天前
Sqli-Scanner SQL注入SKILL自动化挖掘SQL注入,零依赖自动化SQL注入挖掘,赏金猎人
数据库·人工智能·sql·web安全·网络安全·自动化·系统安全
csdndeyeye4 天前
拆解AI投简历插件:塔塔网申的技术逻辑和实测数据
人工智能·自动化·秋招·ai投简历插件·ai找工作·求职助手·应届生就业
小白学大数据4 天前
Python + 大模型行业资讯自动化摘要流水线完整工程实现方案
开发语言·python·自动化