乐闻世界logo
搜索文章和话题

Appium 的 Desired Capabilities 是什么?

2月21日 16:19

Appium 的 Desired Capabilities 是配置测试会话的关键参数,用于指定测试环境、应用和自动化行为。以下是 Appium Desired Capabilities 的详细说明:

基本概念

Desired Capabilities 是一组键值对,用于告诉 Appium Server:

  • 在哪个平台上运行测试
  • 使用哪个设备或模拟器
  • 启动哪个应用
  • 如何配置自动化行为

通用 Capabilities

平台相关

javascript
const capabilities = { platformName: 'Android', // 平台名称 platformVersion: '11.0', // 平台版本 deviceName: 'Pixel 5', // 设备名称 automationName: 'UiAutomator2' // 自动化引擎 };

说明

  • platformName:必需,指定平台(Android、iOS、Windows)
  • platformVersion:可选,指定操作系统版本
  • deviceName:必需,指定设备或模拟器名称
  • automationName:可选,指定自动化引擎

应用相关

javascript
const capabilities = { app: '/path/to/app.apk', // 应用文件路径 appPackage: 'com.example.app', // Android 包名 appActivity: '.MainActivity', // Android Activity bundleId: 'com.example.app', // iOS Bundle ID autoLaunch: true, // 自动启动应用 noReset: true, // 不重置应用状态 fullReset: false // 不完全重置 };

说明

  • app:应用文件的本地路径或 URL
  • appPackage:Android 应用的包名
  • appActivity:Android 应用的启动 Activity
  • bundleId:iOS 应用的 Bundle ID
  • autoLaunch:是否自动启动应用
  • noReset:测试前不重置应用状态
  • fullReset:测试前是否完全重置

Android 特定 Capabilities

javascript
const capabilities = { platformName: 'Android', automationName: 'UiAutomator2', // 应用配置 appPackage: 'com.example.app', appActivity: '.MainActivity', appWaitPackage: 'com.example.app', appWaitActivity: '.MainActivity', // 设备配置 deviceName: 'Android Emulator', platformVersion: '11.0', udid: 'emulator-5554', // 浏览器测试 browserName: 'Chrome', // 权限配置 autoGrantPermissions: true, autoWebview: false, // 其他配置 ignoreUnimportantViews: false, disableWindowAnimation: false, skipServerInstallation: false, skipDeviceInitialization: false };

关键参数

  • udid:设备的唯一标识符
  • autoGrantPermissions:自动授予应用权限
  • ignoreUnimportantViews:忽略不重要的视图
  • disableWindowAnimation:禁用窗口动画

iOS 特定 Capabilities

javascript
const capabilities = { platformName: 'iOS', automationName: 'XCUITest', // 应用配置 bundleId: 'com.example.app', app: '/path/to/app.ipa', // 设备配置 deviceName: 'iPhone 14', platformVersion: '16.0', udid: 'auto', // 模拟器配置 wdaStartupRetries: 4, wdaLocalPort: 8100, usePrebuiltWDA: false, wdaConnectionTimeout: 60000, // 其他配置 showXcodeLog: false, xcodeOrgId: 'TEAM_ID', xcodeSigningId: 'iPhone Developer', updatedWDABundleId: 'com.example.app.WebDriverAgentRunner' };

关键参数

  • udid:设备的唯一标识符(真机)或 'auto'(模拟器)
  • wdaStartupRetries:WebDriverAgent 启动重试次数
  • wdaLocalPort:WebDriverAgent 本地端口
  • usePrebuiltWDA:使用预构建的 WebDriverAgent
  • xcodeOrgId:Xcode 团队 ID(真机测试)
  • xcodeSigningId:Xcode 签名 ID(真机测试)

会话配置 Capabilities

javascript
const capabilities = { // 超时配置 newCommandTimeout: 60, // 新命令超时时间(秒) commandTimeouts: { implicit: 0, // 隐式等待超时 pageLoad: 300000, // 页面加载超时 script: 30000 // 脚本执行超时 }, // 语言和区域 language: 'zh-CN', locale: 'zh_CN', // 时区 timezone: 'Asia/Shanghai', // 其他配置 clearSystemFiles: true, eventTimings: true, enableMultiWindows: false };

性能优化 Capabilities

javascript
const capabilities = { // 跳过不必要的步骤 skipServerInstallation: false, skipDeviceInitialization: false, skipUninstall: false, // 禁用动画 disableWindowAnimation: true, ignoreUnimportantViews: true, // 优化性能 nativeWebScreenshot: true, screenshotQuality: 0, mjpegScreenshotUrl: 'http://localhost:8080/stream' };

调试 Capabilities

javascript
const capabilities = { // 日志配置 showXcodeLog: true, androidInstallTimeout: 90000, uiautomator2ServerInstallTimeout: 200000, // 调试模式 debugLogSpacing: true, suppressKillServer: false, // 详细日志 systemPort: 8200, mjpegServerPort: 7810 };

最佳实践

1. 合理配置 Capabilities

javascript
// 使用环境变量 const capabilities = { platformName: process.env.PLATFORM_NAME || 'Android', deviceName: process.env.DEVICE_NAME || 'emulator-5554', app: process.env.APP_PATH || '/path/to/app.apk' };

2. 分离平台配置

javascript
// android.config.js module.exports = { platformName: 'Android', automationName: 'UiAutomator2', appPackage: 'com.example.app', appActivity: '.MainActivity' }; // ios.config.js module.exports = { platformName: 'iOS', automationName: 'XCUITest', bundleId: 'com.example.app' }; // 根据平台选择配置 const platform = process.env.PLATFORM || 'Android'; const capabilities = require(`./${platform.toLowerCase()}.config.js`);

3. 使用默认值

javascript
const defaultCapabilities = { newCommandTimeout: 60, autoLaunch: true, noReset: false, fullReset: false }; const capabilities = { ...defaultCapabilities, platformName: 'Android', deviceName: 'Pixel 5' };

4. 验证 Capabilities

javascript
function validateCapabilities(capabilities) { const required = ['platformName', 'deviceName', 'automationName']; const missing = required.filter(key => !capabilities[key]); if (missing.length > 0) { throw new Error(`Missing required capabilities: ${missing.join(', ')}`); } return capabilities; } const capabilities = validateCapabilities({ platformName: 'Android', deviceName: 'Pixel 5', automationName: 'UiAutomator2' });

常见问题

  1. 找不到元素

    • 检查 automationName 是否正确
    • 确认应用已正确启动
    • 验证元素定位策略
  2. 应用启动失败

    • 检查 appPackageappActivity 是否正确
    • 确认应用文件路径正确
    • 查看日志了解详细错误
  3. 权限问题

    • 设置 autoGrantPermissions: true
    • 手动授予必要权限
    • 检查应用权限配置

Appium 的 Desired Capabilities 为测试人员提供了灵活的配置方式,通过合理配置,可以满足各种测试场景的需求。

标签:Appium