尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Appium 会话能力(Capabilities)权威指南:服务端与基础驱动识别的全部能力详解

Appium 会话能力(Capabilities)权威指南:服务端与基础驱动识别的全部能力详解 Appium 会话能力Capabilities权威指南服务端与基础驱动识别的全部能力详解【免费下载链接】appiumCross-platform automation framework for all kinds of apps, built on top of the W3C WebDriver protocol项目地址: https://gitcode.com/GitHub_Trending/ap/appium本指南以 Appium 官方文档 Session Capabilities 参考该文档的日文/英文版本内容一致为核心骨架系统梳理 Appium 服务端与 base driver 识别、校验的每一类能力Capability必选能力、可选能力与仅校验能力并结合当前仓库中packages/base-driver与packages/appium的源码实现深入剖析能力从前缀剥离、类型校验到会话启动的完整链路。读完本文你将能够正确构造一个可被 Appium 2.x 服务端接受的会话请求、准确区分服务端直接处理与仅校验后转发给驱动的能力、理解appium:options分组、webSocketUrlBiDi 支持以及 always-match / first-match 的底层处理逻辑。什么是 Session CapabilitiesCapabilities 是启动 Appium 会话Session的核心参数以键值对key-value pairs的形式描述会话所需的各项特性例如目标移动操作系统、设备型号与版本、要使用的自动化驱动名称等。值的类型可以是任意合法 JSON 类型甚至可以嵌套对象。其最重要的约束是会话生命周期内能力不可变更——一旦能力被发送到服务端并成功创建会话就无法再修改如果某个驱动支持在会话运行期间调整行为它会借助 Settings API 来实现。Appium 的能力体系遵循 W3C WebDriver 规范。能力总览服务端识别的三类能力根据官方能力参考文档Appium 服务端与 base driver 识别以下三类能力。凡是基础驱动识别的能力所有具体驱动XCUITest、UiAutomator2、Espresso 等也都天然支持——这正是继承 base driver带来的统一能力底座。必选能力Required Capabilities这两项能力被 Appium 服务端/base driver 直接使用且在所有Appium 会话中都是显式必需的能力描述类型platformName承载应用或浏览器的平台类型stringappium:automationName要使用的 Appium 驱动名称string其中platformName是 W3C 标准能力无需也不能加appium:前缀而appium:automationName是 Appium 特有的扩展能力必须携带appium:厂商前缀。该能力直接决定 Appium 2.x 在会话创建时实例化哪一个已安装的驱动其取值对应 常量定义 中登记的一批官方驱动名例如uiautomator2、xcuitest、espresso、mac2、windows、safari、gecko、chromium等也可以是任意通过appium driver install安装的第三方驱动。可选能力Optional Capabilities这些能力同样被 Appium 服务端/base driver 直接使用但并非强制且部分带有默认值能力描述类型默认值webSocketUrl是否启用 WebDriver BiDi 协议支持boolean—appium:eventTimings已弃用是否收集 Event Timings。该能力已弃用请改用getLogEvents端点boolean—appium:newCommandTimeoutAppium 服务端在终止会话前等待客户端发送命令的秒数取值为0时禁用超时number60appium:printPageSourceOnFindFailure当查找元素的请求失败时是否获取页面源码并将其打印到 Appium 日志boolean—其中appium:newCommandTimeout的默认值60秒并非凭空而来在 DriverCore 构造函数 中定义了NEW_COMMAND_TIMEOUT_MS 60 * 1000毫秒并在this.newCommandTimeoutMs NEW_COMMAND_TIMEOUT_MS处赋给驱动实例。通过 timeouts 命令实现 中的setNewCommandTimeout方法运行时还可以用 W3C 的/timeouts端点以type: command动态修改该值parseTimeoutArgument会拒绝负数与非数字输入MIN_TIMEOUT 0。当驱动持有多个受管驱动managed drivers时setNewCommandTimeout会把新超时值同步广播给所有子驱动。仅校验能力Validated Capabilities这一类能力不被 Appium 服务端/base driver 直接使用但由于它们在众多驱动中意义重大服务端仍会对其施加类型校验实际处理与否完全取决于具体驱动属于可选行为能力校验规则platformVersion必须是stringappium:app必须是string空值会被忽略appium:autoLaunch已弃用必须是booleanappium:autoWebview必须是booleanappium:fullReset必须是boolean与appium:noReset互斥appium:language必须是stringappium:locale必须是stringappium:orientation必须是LANDSCAPE或PORTRAITappium:noReset必须是boolean与appium:fullReset互斥appium:udid必须是string注意appium:fullReset与appium:noReset的互斥关系二者不可同时出现在同一会话的能力集合中这正是能力组级约束capabilities as a group的一个典型例子——驱动可以对一组能力施加比单个类型校验更复杂的约束关系例如 XCUITest 驱动建议browserName、appium:app、appium:bundleId至少包含其一否则无法自动安装或启动任何应用。未列出的能力直接转发文档特别强调了一个重要事实不在上述列表中的能力不会被 Appium 拒绝。它们会被原样转发给当前激活的驱动或插件处理。这意味着各驱动和插件可以也应该定义自己的专有能力用户只需查阅对应驱动/插件的文档即可。官方已知驱动清单见 Ecosystem Drivers。深入原理能力解析与校验的底层实现理解了能力分类后再看 base driver 是如何把一份能力请求变成可用的会话参数的。核心实现集中在 capabilities.ts。厂商前缀的剥离所有 Appium 扩展能力必须以appium:开头该前缀在 capabilities.ts 中被定义为常量APPIUM_VENDOR_PREFIX appium:。stripAppiumPrefixes函数capabilities.ts会把能力对象拆成带前缀与不带前缀两组不带前缀的必须是 W3C 标准能力带前缀的则剥离appium:后进入统一处理。如果发现标准能力被错误地加上了appium:前缀例如写了appium:platformName服务端会记录警告日志。约束与类型校验器校验过程依赖 Validator 中内置的一套约束校验器包括isString、isNumber、isBoolean、isObject、isArray、presence、inclusion、deprecated等。上文的仅校验能力表格正是这些约束的直接体现例如platformVersion对应isStringappium:orientation对应inclusion取值必须包含于[LANDSCAPE, PORTRAIT]必选能力对应presence。值得一提的细节是isNumber与isBoolean都宽容地接受合法字符串如60、true但会打印功能可能受损的警告日志presence校验在allowEmpty: false时会拒绝空字符串。校验失败时validateCapscapabilities.ts会抛出InvalidArgumentError将所有失败项以attribute reason; ...的形式汇总成一条错误消息。W3C 处理流程parseCaps 与匹配parseCaps 严格遵循 W3C 规范的能力处理步骤先校验capabilities是 JSON 对象、firstMatch是数组空数组会被宽容地补一个空对象并告警随后检查是否存在无前缀且非标准的能力并直接报错再剥离前缀、分别校验alwaysMatch与各firstMatch最后把alwaysMatch依次与每个firstMatch合并mergeCaps 禁止两侧出现同名属性否则抛错找到第一个可匹配的组合即作为会话能力这就是first-match语义。processCapabilities则是对外入口匹配失败时抛出行细化的InvalidArgumentError。标准 W3C 能力与appium:前缀W3C 规范要求扩展能力必须带厂商命名空间前缀以冒号结尾。Appium 的厂商前缀就是appium:。在 capabilities.ts 中定义的标准能力集合STANDARD_CAPS包括browserName、browserVersion、platformName、acceptInsecureCerts、pageLoadStrategy、proxy、setWindowRect、timeouts、strictFileInteractability、unhandledPromptBehavior、userAgent、webSocketUrl。判断一个能力名是否属于标准能力使用isStandardCap大小写不敏感。常见的 Appium 扩展能力在 guides/caps.md 中有详细列表包括能力名类型描述appium:automationNamestring要使用的 Appium 驱动名称appium:udidstring要自动化设备的唯一设备标识符appium:appstring可安装应用的路径根据客户端库的不同appium:前缀可能被自动补全但官方建议始终显式写出前缀以保证清晰与跨客户端一致。使用appium:options分组能力当测试里使用大量appium:能力时写法会变得冗长。可以将所有 Appium 能力合并为单个appium:options能力的对象值且对象内部的能力无需再写前缀。示例{ platformName: iOS, appium:options: { automationName: XCUITest, platformVersion: 16.0, app: /path/to/your.app, deviceName: iPhone 12, noReset: true } }注意构造值为对象的能力在不同语言客户端中写法各异请参考对应客户端文档。优先级规则如果同一能力既出现在appium:options内部又出现在顶层appium:options内部的值会覆盖顶层值。底层实现上promoteAppiumOptions 会在会话创建前把appium:options中的内容提升到顶层promoteAppiumOptionsForObjectcapabilities.ts会验证appium:options必须是普通对象、内部能力名必须是字符串且不能是标准 W3C 能力否则抛SessionNotCreatedError并为内部每个能力自动补上appium:前缀若发生覆盖还会打印警告日志。这解释了为什么对象内部不需要写前缀——服务端在解析阶段已替你处理。always-match 与 first-match 能力W3C 规范允许客户端给服务端一定的会话类型选择空间通过 always-match 与 first-match 两种能力集实现always-match一组单一能力集合其中每一项都必须被服务端满足否则新会话请求无法继续。first-match一个能力集合数组每个集合都会与 always-match 合并服务端认识的第一个集合将被用来启动会话。在实践层面官方建议 Appium 用户不要使用 first-match而是直接定义明确的期望能力集——它们会被编码为 always-matchfirst-match 数组留空。尽管如此Appium 完全理解 W3C 规范中 always-match / first-match 的语义即便你使用了这两个特性也会按预期工作。每种客户端库定义这两类能力的方式不同请查阅客户端文档。该流程的源码实现在前文parseCaps的合并逻辑中firstMatch数组为空时被宽容地替换为[{}]而 always-match 与 first-match 之间存在同名属性会直接报错W3C 规则 4.4。BiDi 协议与webSocketUrl能力除标准 WebDriver 协议现称 WebDriver Classic外Appium 还支持 WebDriver BiDi 协议。该协议支持是**显式选择加入opt-in**的需要设置标准能力webSocketUrl能力名类型描述webSocketUrlboolean会话是否启用 BiDi 协议基础驱动支持的全部 BiDi 命令可查阅 BiDi 协议 API 参考。与 WebDriver Classic 命令类似各驱动和插件也可以定义自己的标准或自定义 BiDi 命令。从服务端看BiDi 的 WebSocket 端点挂载在/bidi路径见 constants.ts 中的BIDI_BASE_PATH /bidi驱动可通过bidiProxyUrl决定是否将 BiDi 连接代理到上游端点见 core.ts。给云端服务提供者的建议延伸阅读官方文档还专为构建兼容 Appium 的云服务开发者提供了一套建议性非强制性标准能力设计帮助用户在各云平台间获得一致的体验。核心思路是在标准能力之外约定一个以厂商前缀命名的$cloud:appiumOptions对象$cloud应替换为厂商自己的前缀例如 HeadSpin 用headspin、Sauce Labs 用sauce、BrowserStack 用browserstack内部键包括能力用途示例version承载并管理驱动的 Appium 服务端版本省略时行为由提供商决定建议提供最新官方版本2.0.0automationVersion由appium:automationName指定的驱动版本1.55.2automation自定义驱动名称见下文扩展对象会覆盖appium:automationName与$cloud:automationVersion{name: org/custom-driver, source: github, package: custom-driver}plugins应激活的插件及可选版本列表[images, universal-xml]基本示例请求 Appium 2 服务端、XCUITest 驱动 3.52.0 版本并激活 images 插件{ platformName: iOS, appium:platformVersion: 14.4, appium:deviceName: iPhone 11, appium:app: Some-App.app.zip, appium:automationName: XCUITest, $cloud:appiumOptions: { version: 2.0.0, automationVersion: 3.52.0, plugins: [images] } }配合appium:options的等价写法{ platformName: iOS, appium:options: { platformVersion: 14.4, deviceName: iPhone 11, app: Some-App.app.zip, automationName: XCUITest }, $cloud:appiumOptions: { version: 2.0.0, automationVersion: 3.52.0, plugins: [images] } }对于支持动态安装任意扩展的云平台官方还定义了扩展对象extension objectJSON 结构包含namenpm 包名或 git/GitHub 规格、versionnpm 版本号或 git SHA、可选的source建议取值appium、npm、git、github默认appium表示官方列表、可选的package从 git/GitHub 下载时必需的 npm 包名。$cloud:appiumOptions.automation可以携带单个扩展对象来指定驱动plugins列表的每个元素也可以是扩展对象以精确指定版本。注意这些仅是给云服务提供商的建议具体实现在前端/负载均衡处校验、执行appium driver/appium pluginCLI 命令等完全由各服务提供商自行决定。小结本指南完整覆盖了 Appium 官方能力参考文档的全部内容并下沉到源码验证了每个结论三类能力模型platformName与appium:automationName是所有会话的必选项webSocketUrl、appium:eventTimings已弃用、appium:newCommandTimeout默认 60 秒、appium:printPageSourceOnFindFailure由服务端直接处理其余十项仅校验能力只做类型/取值校验后交由驱动处理。未列出的能力一律转发因此各驱动与插件的专有能力可以自由扩展不会因为不在服务端列表而被拒绝。底层机制清晰可查前缀剥离、约束校验、W3C 解析与匹配分别实现在 capabilities.ts 与 validation.ts 中appium:newCommandTimeout的 60 秒默认值来自 core.ts并可通过/timeouts命令动态调整timeout.ts。掌握这份能力清单你在排查会话为何创建失败、为多平台iOS/Android/桌面浏览器编写统一测试基座、或实现 Appium 兼容云服务时都能快速定位问题所在。【免费下载链接】appiumCross-platform automation framework for all kinds of apps, built on top of the W3C WebDriver protocol项目地址: https://gitcode.com/GitHub_Trending/ap/appium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表