UIAutomator2 自动化测试工具详解

UIAutomator2 是一个 Android 自动化测试框架,是 UIAutomator 的升级版本。它能够对 Android 应用进行 UI 自动化测试,支持跨进程、跨应用的测试,能够模拟用户的操作并验证 UI 的表现。UIAutomator2 在原有的基础上进行了增强,支持更多的功能,尤其在兼容性和稳定性方面有所提升。

UIAutomator2 特点

  1. 跨应用测试:UIAutomator2 可以跨多个应用进行测试。
  2. 支持多设备:支持多个 Android 设备或者模拟器进行并发测试。
  3. 更好的稳定性与性能:与 UIAutomator 相比,UIAutomator2 提供了更好的性能和稳定性。
  4. 与 Appium 配合使用:UIAutomator2 是 Appium 框架中的一个重要组件,用于实现 Android 平台的自动化测试。
  5. 自动化操作:支持模拟点击、输入、滑动、滚动等 UI 操作。

UIAutomator2 架构

UIAutomator2 的架构主要包括以下几个部分:

  1. 客户端:通常是测试脚本和测试框架,负责与设备交互,发起测试命令。
  2. 服务器端:设备上的 uiautomator 服务,负责执行具体的 UI 操作。它提供了一些 API 来模拟用户的操作,如点击、输入文本、获取 UI 元素等。
  3. UIAutomator2 库:这个库包含了用于测试的工具和 API,提供了与 UI 交互的能力。

UIAutomator2 的安装与配置

1. 安装依赖环境

UIAutomator2 的测试框架依赖一些环境,包括 Android SDK、Appium 等。

  1. 安装 Android SDK
    • 下载并安装 Android SDK。
    • 设置 ANDROID_HOME 环境变量,指向 SDK 路径。
  2. 安装 Java Development Kit (JDK)
    • 安装 JDK,设置 JAVA_HOME 环境变量。
  3. 安装 Appium
    Appium 是一个跨平台的自动化测试框架,支持 UIAutomator2 作为 Android 测试的后端。npm install -g appium
  4. 安装 UIAutomator2 驱动
    使用 Appium 安装 UIAutomator2 驱动:appium driver install uiautomator2
2. 配置 UIAutomator2
  • 设备连接:确保你的 Android 设备或模拟器已经连接并启用了开发者模式,且开启了 USB 调试。
  • 启动 Appium:启动 Appium 服务器,它会监听来自客户端的请求并通过 UIAutomator2 执行命令。appium
3. 配置设备的 Appium 服务

在配置中,设置 UIAutomator2 作为自动化工具,指定 Android 设备的配置选项,如设备 ID、操作系统版本等:

{
  "platformName": "Android",
  "platformVersion": "10",
  "deviceName": "emulator-5554",
  "app": "/path/to/your/app.apk",
  "automationName": "UiAutomator2"
}

UIAutomator2 编写测试

UIAutomator2 提供了丰富的 API 来进行 UI 操作。以下是常见的 UI 操作方法:

1. 启动 App

你可以使用 Appium 的 driver 对象来启动应用:

let driver = await new wd.promiseChainRemote({
  host: 'localhost',
  port: 4723,
  path: '/wd/hub',
  capabilities: {
    platformName: 'Android',
    deviceName: 'Android Emulator',
    appPackage: 'com.example.myapp',
    appActivity: 'com.example.myapp.MainActivity',
    automationName: 'UiAutomator2',
  }
});

2. 查找 UI 元素

UIAutomator2 提供了许多方法来查找 UI 元素,如 findElementfindElements 等。

  • 通过 ID 查找元素
let element = await driver.elementById('com.example.myapp:id/button');

  • 通过 XPath 查找元素
let element = await driver.elementByXPath('//android.widget.Button[@content-desc="Login"]');

3. 点击操作

模拟点击元素:

await element.click();

4. 输入文本

模拟在输入框中输入文本:

let inputField = await driver.elementById('com.example.myapp:id/username');
await inputField.sendKeys('testuser');

5. 滑动与滚动

UIAutomator2 支持模拟滑动操作,例如:

await driver.swipe(100, 1000, 100, 500, 1000); // 从 (100, 1000) 滑动到 (100, 500)

6. 获取元素的属性或文本

你可以使用 .text 或 .getAttribute() 来获取元素的文本或属性值:

let text = await element.text();
console.log(text); // 输出元素的文本

7. 等待元素加载

在执行某些操作前,可能需要等待元素加载完成,UIAutomator2 提供了显式等待和隐式等待:

let element = await driver.waitForElementById('com.example.myapp:id/button', 5000); // 等待 5 秒

UIAutomator2 高级功能

  1. 跨应用测试
    UIAutomator2 支持跨应用的测试,可以在多个应用间切换。
  2. 后台运行与前台切换
    使用 driver.background() 来切换应用到后台,或使用 driver.activateApp() 来恢复应用到前台。
  3. 权限管理
    UIAutomator2 支持动态管理应用权限,可以通过它来授权或拒绝权限请求。
  4. 屏幕截图
    UIAutomator2 提供了截图功能,帮助在测试失败时进行问题排查。let screenshot = await driver.takeScreenshot();
  5. 多设备测试
    支持多个设备的并行测试,只需要配置不同的设备,并通过 Appium 同时启动多个测试实例。

UIAutomator2 与 Appium 配合

在 Appium 中使用 UIAutomator2 驱动时,你可以编写跨平台的自动化测试。UIAutomator2 驱动专注于 Android 的测试,而 Appium 可以将其扩展到 iOS、Windows 等平台。

UIAutomator2 常见问题与调试

  1. 设备连接失败
    确保设备启用了 USB 调试并且连接正常。可以使用 adb devices 命令检查设备连接情况。
  2. UI 元素定位失败
    • 确保你使用了正确的定位策略(ID、XPath、类名等)。
    • 使用 UIAutomator Viewer 工具来查看元素的属性和层级结构。
  3. 测试用例执行失败
    • 查看 Appium 服务器的日志文件,定位具体问题。
    • 使用 driver.saveScreenshot() 来保存截图进行调试。

总结

UIAutomator2 是一个强大的 Android 自动化测试工具,特别适用于复杂的 UI 测试。通过与 Appium 等测试框架的配合,可以实现跨平台的自动化测试。无论是用于单一设备还是多个设备的并行测试,UIAutomator2 都能提供稳定的支持。它不仅能够执行基本的 UI 操作,还支持高级功能,如跨应用操作、权限管理等。掌握 UIAutomator2 的使用,将大大提高 Android 应用的自动化测试效率。