移动端自动化测试Appium,从入门到项目实战Python版

xiao_wenwen123 · · 245 次点击 · · 开始浏览    

移动端自动化测试Appium,从入门到项目实战Python版

一、为何选择 Appium?移动端自动化测试的优选工具

“获课”: itxt.top/13541/

在移动端应用测试领域,手动测试面临 “重复操作繁琐、回归测试耗时、多设备兼容性难覆盖” 等痛点,而 Appium 凭借 “跨平台兼容、无侵入式测试、支持多语言” 的核心优势,成为主流解决方案。尤其对于需覆盖 iOS 与 Android 双端、多机型的测试场景,Appium 能大幅提升测试效率,其核心价值体现在三个维度:

  • 跨平台统一框架,降低多端测试成本

Appium 打破 iOS 与 Android 的测试壁垒,采用 “一套脚本适配双端” 的模式 —— 只需基于 Appium 核心 API 编写测试用例,即可在 iOS 模拟器 / 真机、Android 模拟器 / 真机上执行,无需为不同平台单独开发脚本。例如,测试 “登录功能” 时,通过find_element定位用户名输入框、send_keys输入账号的核心逻辑,在 iOS 与 Android 设备上完全通用,仅需针对极少数平台特有控件(如 iOS 的 UISwitch、Android 的 Switch)做细微适配,多端测试效率提升 60% 以上。

  • 无侵入式测试,贴合真实应用场景

与部分需要在应用中植入测试 SDK 的工具不同,Appium 基于原生系统 API(iOS 的 XCUITest、Android 的 UIAutomator2)实现自动化控制,无需修改应用源码或打包测试版本。这意味着测试对象与用户实际使用的应用完全一致,能精准复现真实场景下的问题(如应用后台切换后的数据恢复、推送消息触发的交互),避免因测试环境与生产环境差异导致的 “测试通过但线上报错” 问题。

  • 多语言与多框架兼容,适配团队技术栈

Appium 支持 Java、Python、JavaScript、Ruby 等主流编程语言,测试团队可根据现有技术栈灵活选择开发语言 ——Java 团队可结合 TestNG/JUnit 构建测试框架,Python 团队可搭配 Pytest 实现用例管理,无需为学习新语言额外投入成本。同时,Appium 可与持续集成(CI)工具(Jenkins、GitLab CI)无缝集成,实现 “代码提交后自动触发多设备测试、生成测试报告” 的全流程自动化,助力敏捷开发中的快速迭代测试。

对于不同角色,Appium 的价值各异:测试工程师可通过自动化脚本替代 70% 以上的重复手动操作;测试开发工程师能基于 Appium 封装通用测试框架,提升团队测试效率;产品与开发团队可通过自动化测试报告快速定位版本兼容性问题,是移动端应用质量保障的核心工具。

二、Appium 核心知识体系:从环境搭建到核心操作

Appium 的学习需围绕 “环境准备 - 元素定位 - 用例编写 - 多端执行” 构建知识链,核心模块包括环境搭建、元素定位、核心 API、多设备管理,每个模块均结合实战场景设计:

(一)环境搭建:打通自动化测试的 “基础链路”

Appium 环境涉及 “开发工具 - 模拟器 / 真机 - 依赖组件” 的协同配置,需针对 iOS 与 Android 分别处理,核心步骤如下:

  1. 通用基础环境配置

无论测试 iOS 还是 Android,需先完成以下核心组件安装:

    • Node.js:Appium Server 基于 Node.js 运行,需安装 v14 + 版本,通过node -v验证安装;
    • Appium Server:通过 npm 全局安装(npm install -g appium),或使用 Appium Desktop(带可视化界面的版本,适合新手),启动后默认占用 4723 端口,通过http://localhost:4723/wd/hub可访问服务;
    • 客户端库:根据编程语言选择对应客户端(如 Java 选择appium-java-client,通过 Maven 引入;Python 选择Appium-Python-Client,通过 pip 安装),客户端负责与 Appium Server 通信,发送测试指令。
  1. Android 端专项配置

需搭建 Android 开发环境并配置设备连接:

    • Android SDK:安装 Android Studio 并下载对应版本 SDK,配置ANDROID_HOME环境变量,确保adb工具(用于设备管理)可全局调用;
    • 模拟器 / 真机准备:模拟器推荐使用雷电模拟器、Genymotion(性能更接近真机),需开启 “开发者模式” 与 “USB 调试”;真机需通过 USB 连接电脑,在开发者选项中开启 “USB 调试” 与 “USB 安装”,通过adb devices验证设备是否正常连接;
    • UIAutomator2 驱动:Appium 测试 Android 需依赖 UIAutomator2 驱动,首次执行测试时 Appium 会自动安装,或手动通过appium driver install uiautomator2提前安装,驱动负责与 Android 系统 API 交互。
  1. iOS 端专项配置

需依赖 macOS 环境与 Xcode,配置流程相对复杂:

    • Xcode 与 iOS SDK:安装最新版 Xcode,通过 “Preferences-Downloads” 下载对应版本 iOS 模拟器与 SDK,确保xcrun工具可正常调用;
    • 模拟器 / 真机配置:模拟器可直接在 Xcode 中启动(如 iPhone 15、iOS 17);真机测试需配置 Apple 开发者账号,在 Xcode 中添加设备 UUID,并为应用签名(确保测试应用可在真机上安装运行);
    • XCUITest 驱动:Appium 测试 iOS 依赖 XCUITest 驱动,手动安装命令为appium driver install xcuitest,驱动需与 Xcode 版本匹配(如 Xcode 15 对应 XCUITest 驱动 1.60 + 版本)。

(二)元素定位:自动化测试的 “核心前提”

Appium 通过定位应用中的 UI 元素(如输入框、按钮、列表)实现操作,精准定位是编写稳定测试用例的关键。常用定位方式及适用场景如下:

  1. 基础定位方式:适用于简单控件
    • ID 定位:通过元素的resource-id(Android)或accessibilityIdentifier(iOS)定位,是最推荐的方式,唯一性高、稳定性强。例如,定位 Android 登录按钮:driver.findElement(By.id("com.example.app:id/login_btn"));
    • XPath 定位:通过元素层级路径或属性匹配定位,适用于无 ID 或 ID 不唯一的场景。例如,定位 “用户名输入框”(父元素为 “登录表单”,类型为 EditText):driver.findElement(By.xpath("//android.widget.LinearLayout[@resource-id='com.example.app:id/login_form']/android.widget.EditText[1]"));
    • Accessibility ID 定位:通过元素的 “无障碍标签”(Android 的content-desc、iOS 的accessibilityLabel)定位,支持双端通用,例如:driver.findElement(By.accessibilityId("username_input"))。
  1. 高级定位工具:提升定位效率

手动编写定位表达式易出错,需借助工具可视化获取元素属性:

    • Appium Inspector:Appium Desktop 自带的元素探查工具,连接设备后可实时查看应用界面元素,点击控件即可获取 ID、XPath、Accessibility ID 等属性,支持直接生成定位代码;
    • Android Studio Layout Inspector:用于 Android 应用,可查看控件的层级结构、属性值,帮助排查 “定位失败” 问题(如控件被遮挡、属性动态变化);
    • Xcode Accessibility Inspector:用于 iOS 应用,可查看控件的accessibilityLabel、frame等信息,确保元素支持无障碍定位。
  1. 定位避坑技巧:保障用例稳定性

实际测试中常因 “元素动态加载、层级变化” 导致定位失败,需注意:

    • 避免使用 “绝对 XPath”(如/hierarchy/android.widget.FrameLayout[1]/android.widget.LinearLayout[2]),优先用 “相对 XPath”(基于属性匹配,如//*[@text='登录']);
    • 针对动态 ID(如包含随机字符串的 ID),使用 “模糊匹配”(Android 用contains,如//*[contains(@resource-id, 'login_')];iOS 用predicate,如type == 'XCUIElementTypeButton' AND name CONTAINS '登录');
    • 等待元素加载完成:通过WebDriverWait设置显式等待,避免 “元素未出现就执行操作”,例如 Java 代码:new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.visibilityOfElementLocated(By.id("login_btn")))。

(三)核心 API 与用例编写:实现自动化测试逻辑

Appium 提供丰富的 API 覆盖移动端常见操作,结合测试框架(如 TestNG、Pytest)可快速编写结构化测试用例,核心操作与实战示例如下:

  1. 会话管理:启动与关闭应用

每个测试用例需先创建Desired Capabilities(配置测试参数),再启动应用会话:

    • Android 示例(Java)

 

DesiredCapabilities caps = new DesiredCapabilities();

caps.setCapability("platformName", "Android"); // 平台名称

caps.setCapability("deviceName", "Android Emulator"); // 设备名称

caps.setCapability("appPackage", "com.example.app"); // 应用包名

caps.setCapability("appActivity", ".MainActivity"); // 启动Activity

caps.setCapability("automationName", "UIAutomator2"); // 自动化引擎

// 启动会话,连接Appium Server

AndroidDriver<AndroidElement> driver = new AndroidDriver<>(new URL("http://localhost:4723/wd/hub"), caps);

    • iOS 示例(Python)

 

from appium import webdriver

desired_caps = {

"platformName": "iOS",

"deviceName": "iPhone 15",

"app": "/path/to/your/app.ipa", # iOS应用路径

"automationName": "XCUITest",

"platformVersion": "17.0" # iOS版本

}

driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)

    • 测试结束后需关闭会话:driver.quit(),释放设备资源。
  1. 常用操作 API:覆盖核心测试场景

Appium API 可实现 “输入、点击、滑动、截图” 等操作,满足绝大多数测试需求:

    • 输入操作:通过send_keys输入文本,clear清空内容,例如:

 

// 定位用户名输入框并输入账号

AndroidElement usernameInput = driver.findElement(By.id("com.example.app:id/username_input"));

usernameInput.clear();

usernameInput.sendKeys("test_user123");

    • 点击操作:通过click触发按钮、列表项等控件的点击事件,例如:

 

# 点击登录按钮

login_btn = driver.find_element(By.accessibility_id("login_btn"))

login_btn.click()

    • 滑动操作:通过swipe或scroll实现页面滚动,例如 Android 滑动:

 

// 从(500, 1500)滑动到(500, 500)(上滑),持续200毫秒

driver.swipe(500, 1500, 500, 500, 200);

    • 截图与断言:通过getScreenshotAs截取当前界面(用于故障回溯),结合测试框架断言验证结果,例如:

 

// 断言登录后跳转的首页标题是否正确

AndroidElement homeTitle = driver.findElement(By.id("com.example.app:id/home_title"));

Assert.assertEquals(homeTitle.getText(), "首页", "登录后未跳转至首页");

  1. 特殊场景处理:应对复杂测试需求

针对 “弹窗、手势操作、后台切换” 等特殊场景,需使用 Appium 扩展 API:

    • 弹窗处理:通过switch_to.alert处理系统弹窗(如权限申请弹窗),例如:

 

# 处理Android权限弹窗(允许相机权限)

alert = driver.switch_to.alert

alert.accept() # 点击“允许”

    • 手势操作:通过TouchAction实现 “长按、双击、滑动” 等复杂手势,例如长按保存图片:

 

TouchAction touchAction = new TouchAction(driver);

// 长按图片控件2秒

touchAction.longPress(LongPressOptions.longPressDuration(Duration.ofSeconds(2)))

.waitAction(WaitOptions.waitOptions(Duration.ofSeconds(1)))

.perform();

    • 应用后台切换:通过runAppInBackground将应用切换到后台,模拟用户切应用场景,例如:

 

// 将应用切换到后台5秒后唤醒

driver.runAppInBackground(Duration.ofSeconds(5));

(四)多设备并行与 CI 集成:提升测试效率

在回归测试或兼容性测试中,需同时在多台设备上执行用例,Appium 结合工具可实现并行测试与自动化触发:

  1. 多设备并行测试

通过 “Appium Grid” 实现多设备管理与并行执行,核心步骤:

    • 启动 Hub 节点(管理所有设备):appium --use-plugins=appium-grid --grid-port 4723;
    • 注册 Node 节点(每个设备对应一个 Node):例如注册 Android 模拟器节点:

 

appium --use-plugins=appium-grid \

--grid-url http://localhost:4723 \

--node-config ~/node_android.json \ # 配置设备信息(platformName、deviceName等)

--port 4724

    • 编写并行测试脚本:使用 TestNG 的parallel="tests"或 Pytest 的pytest-xdist插件,实现用例在多设备上同时执行,例如 TestNG 通过@Parameters指定设备参数,分配不同用例到不同设备。
  1. 持续集成(CI)集成

将 Appium 测试融入 CI 流程,实现 “代码提交后自动测试”:

    • Jenkins 集成:在 Jenkins 中创建 “自由风格项目”,配置步骤:
      1. 拉取代码(通过 Git 插件关联代码仓库);
      1. 启动 Appium Server 与模拟器(通过 “Execute shell” 执行appium &与emulator -avd Pixel_5_API_33);
      1. 执行测试用例(通过 Maven 执行mvn test或 Python 执行pytest);
      1. 生成测试报告(使用 Allure 插件生成可视化报告,包含用例执行结果、截图、日志);
    • 结果通知:配置 Jenkins 邮件通知,测试失败后自动发送报告给测试与开发团队,确保问题及时发现。

三、Appium 学习路径:从入门到实战精通

阶段 1:基础入门期(1-2 周)—— 搭建环境,掌握核心操作

  • 核心任务:完成 Appium 环境搭建(优先 Android,门槛较低),掌握元素定位、基础 API 与简单用例编写,理解测试会话的生命周期。
  • 实战重点
    1. 搭建 Android+Appium+Java/Python 环境,成功启动模拟器并安装测试应用(如 Demo 应用 “ApiDemos-debug.apk”);
    1. 使用 Appium Inspector 定位 “按钮、输入框” 等控件,编写第一个测试用例(如 “启动应用→点击按钮→验证页面跳转”);
    1. 练习基础 API:find_element、send_keys、click、quit,确保用例能稳定执行。
  • 验收标准:能独立搭建环境,编写 3 个以上简单用例,实现 “输入、点击、断言” 核心逻辑,用例执行成功率 100%。

阶段 2:进阶攻坚期(2-3 周)—— 攻克复杂场景,提升用例稳定性

  • 核心任务:掌握高级定位技巧、特殊场景处理(弹窗、手势、后台切换),学习用例设计原则,提升用例的稳定性与可维护性。
  • 实战重点
    1. 解决定位难题:针对 “动态 ID、控件遮挡、元素加载延迟” 等问题,使用模糊匹配、显式等待、Accessibility ID 定位;
    1. 处理复杂场景:编写 “权限弹窗处理、长按保存、应用后台切换” 的测试用例,覆盖真实用户操作场景;
    1. 封装基础方法:将 “元素定位、输入、点击” 等重复操作封装为工具类(如ElementUtils.findElement(driver, by)),减少代码冗余。
  • 验收标准:能独立处理 80% 以上的复杂场景,编写的用例在不同 Android 版本(如 Android 11、13)的模拟器上稳定执行,无 “偶发性失败”。

阶段 3:iOS 测试与多端适配期(2-3 周)—— 覆盖双端测试,掌握适配技巧

  • 核心任务:搭建 iOS 测试环境,学习 iOS 特有控件定位与操作,实现双端用例适配,掌握跨平台测试的差异点。
  • 实战重点
    1. 在 macOS 上搭建 Xcode+iOS 模拟器 + Appium 环境,成功启动 iOS 模拟器并安装测试应用(如 “TestApp.app

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

245 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传