Skip to content

一、Appium 核心架构与运行模型 ​

Appium 是一款跨平台的移动端自动化测试框架,支持 Android 和 iOS 原生应用(Native App)、混合应用(Hybrid App)以及移动 Web 自动化。

其核心采用典型的 Client / Server 架构:

text
┌────────────────────────────────────────────────────────┐
│             测试代码端 (Appium-Python-Client)           │
│   • 编写测试脚本      • 发送基于 W3C WebDriver 的请求  │
└───────────────────────────▲────────────────────────────┘
                            │ HTTP JSONWP / W3C 协议
┌───────────────────────────▼────────────────────────────┐
│                    Appium Server 服务端                │
│   • Node.js 驱动运行  • 解析客户端指令并转发给底层驱动 │
└───────────────────────────▲────────────────────────────┘
                            │ UiAutomator2 / XCUITest
┌───────────────────────────▼────────────────────────────┐
│                 移动设备 (真机或模拟器)                │
│   • 运行底层 Bootstrap / UiAutomator2 Server 守护进程   │
│   • 执行点击、输入、滑动及无障碍节点查找               │
└────────────────────────────────────────────────────────┘
  • 测试客户端:使用 Python 编写测试用例,通过标准 HTTP 请求调用 Appium Server;
  • Appium Server:接收请求并调用 Android 底层 UiAutomator2(或 iOS XCUITest)驱动设备完成动作。

二、测试环境准备与工具链对齐 ​

在 Windows / macOS 环境下搭建 Android 自动化测试体系,需要依次打通四大依赖:

  1. JDK 1.8+:配置 JAVA_HOME 环境变量并加入 PATH;
  2. Android SDK Platform-Tools:通过 Android Studio 或独立 SDK 命令行工具安装,配置 ANDROID_HOME,确保 adb 命令全局可用;
  3. 模拟器工具链版本对齐:若使用第三方安卓模拟器,务必将 Android SDK 目录下的 adb.exe 复制替换模拟器安装目录下的同名/配套工具,防止因 ADB Server 版本不一致产生冲突杀进程;
  4. Python 依赖库安装:
    bash
    pip install Appium-Python-Client

三、Desired Capabilities 核心配置详解 ​

Desired Capabilities 是一组键值对,用于在建立 WebDriver Session 时告知 Appium Server 目标设备的系统、版本与待测应用入口:

python
desired_caps = {
    # 操作系统类型
    "platformName": "Android",
    
    # 目标系统大版本(如 10、12,可缺省由驱动自动探测)
    "platformVersion": "12",
    
    # 设备唯一标识(adb devices 左侧输出的序列号或 IP 端口)
    "deviceName": "127.0.0.1:62001",
    
    # 待测 App 的包名 (Package) 与启动入口 Activity
    "appPackage": "com.example.enterprise.app",
    "appActivity": "com.example.enterprise.app.ui.MainActivity",
    
    # 关键配置:保留登录会话,避免每次用例运行都强制清空应用缓存与数据
    "noReset": True,
    
    # 支持中文等 Unicode 字符输入
    "unicodeKeyboard": True,
    "resetKeyboard": True,
    
    # 自动化性能提速关键参数
    "waitForIdleTimeout": 100,      # 降低页面动画闲置等待超时(毫秒)
    "ignoreUnimportantViews": True  # 过滤无用的层级视图节点,大幅加速元素查找
}

四、自动化登录与循环验证实战 ​

结合元素查找与生命周期管理,编写稳定的端到端测试用例:

python
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

def run_mobile_test():
    # 1. 建立与 Appium Server 的远程连接会话
    driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
    
    # 动态微调底层交互加速
    driver.update_settings({"waitForIdleTimeout": 100})
    wait = WebDriverWait(driver, 15)

    try:
        # 2. 显式等待输入框渲染并完成表单填充
        inputs = wait.until(
            EC.presence_of_all_elements_located((AppiumBy.CLASS_NAME, "android.widget.EditText"))
        )
        
        # 依次输入服务器地址、账号、密码
        inputs[0].click()
        inputs[0].clear()
        inputs[0].send_keys("https://gateway.example.com")

        inputs[1].click()
        inputs[1].send_keys("tester_01")

        inputs[2].click()
        inputs[2].send_keys("SecurePass@123")

        # 3. 按照无障碍描述或 XPath 触发登录按钮
        login_btn = wait.until(
            EC.element_to_be_clickable((AppiumBy.XPATH, '//android.widget.Button[@content-desc="登录"]'))
        )
        login_btn.click()

        # 4. 验证登录后主页核心图标是否就绪
        avatar_elem = wait.until(
            EC.visibility_of_element_located((AppiumBy.ID, "com.example.enterprise.app:id/user_avatar"))
        )
        assert avatar_elem.is_displayed(), "登录验证失败:未检测到用户头像"
        print("✓ App 自动化登录用例验证通过")

    finally:
        # 退出驱动释放设备资源
        driver.quit()

if __name__ == "__main__":
    run_mobile_test()

测试开发工程师 · 专注自动化与系统架构 | 邮箱: hansblog@atumsoul.win