5月27日 21:22

Appium 的 Desired Capabilities 是什么?

Appium 的 Desired Capabilities 是一组键值对,用于告诉 Appium Server 如何配置自动化测试会话——包括在哪个平台、哪台设备、启动哪个应用、使用哪个自动化引擎。客户端以 JSON 格式发送这些参数,服务端据此创建对应的测试环境并返回 session ID。

核心参数有哪些?

必须掌握的几个关键参数:

  • platformName:目标平台,值为 Android / iOS / Windows,必填
  • deviceName:设备名称,真机或模拟器均可,必填
  • automationName:自动化引擎,Android 用 UiAutomator2,iOS 用 XCUITest
  • app:待测应用的路径或远程 URL(.apk / .ipa)
json
{ "platformName": "Android", "deviceName": "Pixel 5", "automationName": "UiAutomator2", "app": "/path/to/app.apk" }

Android 和 iOS 有什么区别?

这是面试高频追问。两者差异主要体现在应用标识和引擎配置上:

Android 专属:用 appPackage 指定包名,用 appActivity 指定启动 Activity。例如 appPackage: "com.example.app"appActivity: ".MainActivity"

iOS 专属:用 bundleId 标识应用,真机测试需要配置 xcodeOrgIdxcodeSigningId 完成签名,模拟器则设置 udid: "auto" 即可。

引擎选择也不同——Android 默认 UiAutomator2,iOS 默认 XCUITest,选错引擎会直接导致会话创建失败。

noReset 和 fullReset 有什么区别?

  • noReset: true — 会话结束后保留应用数据,下次启动不重装,适合调试阶段复用状态
  • fullReset: true — 每次会话前卸载应用并重装,确保干净环境,适合持续集成场景

两者互斥,不能同时为 true。面试中常追问"你项目中用的哪个,为什么",回答时要结合实际场景。

常见踩坑点

  1. appActivity 前缀漏写点号 — 应写 .MainActivity 而非 MainActivity,否则 Appium 报找不到 Activity
  2. automationName 与平台不匹配 — iOS 用了 UiAutomator2 会直接报错,务必对齐平台
  3. 真机 udid 填错 — 可通过 adb devices(Android)或 Xcode 设备列表(iOS)确认

追问:如何在多平台项目中管理 Capabilities?

将 Android 和 iOS 配置拆分为独立文件,运行时通过环境变量切换:

javascript
const caps = process.env.PLATFORM === 'ios' ? require('./ios.config') : require('./android.config');

这样既避免配置混乱,又便于 CI 流水线按平台并行执行。

标签:Appium