
如何在 Appium 会话中启用 WebDriver BiDi 协议【免费下载链接】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 会话里WebDriver BiDi 协议的支持是可选开启opt-in的服务器不会自动为你打开 BiDi 通道必须在创建会话时显式声明。它的入口是标准能力webSocketUrl。这篇文章走一遍完整路径安装并启动 Appium 服务器、在 new session 请求中加入该能力、再核对会话返回的能力集确认 BiDi socket 已激活。客户端以官方快速开始文档使用的 JSNode.js WebdriverIO 为例。准备安装并启动 Appium 服务器BiDi 是会话级能力依赖一个正在运行的 Appium 服务器所以先把它跑起来。用npm全局安装 Appium文档明确说明目前不支持其他包管理器npm install -g appium在另一个终端启动服务器appium服务器进程独立于客户端存在必须在尝试创建会话之前显式启动。启动后控制台日志会列出客户端可用来连接该服务器的有效 URL文档中的示例输出为[Appium] You can provide the following URLs in your client code to connect to this server: [Appium] http://127.0.0.1:4723/ (only accessible from the same host)上面这段是文档示例输出你实际的可用地址以服务器日志为准。注意 Appium 安装后不自带任何 driver本文示例会话使用 UiAutomator2 driver需要先安装该 driver安装方式见 Installing the UiAutomator2 Driver。启用 BiDi标准能力webSocketUrl除了标准 WebDriver 协议现在称为 WebDriver ClassicAppium 还支持 WebDriver BiDi 协议。理解这个协议要记住文档给出的两个要点与其他规定 URL 端点的协议不同WebDriver BiDi 命令是以 websocket 事件的形式发送的driver 和 client 双方都可以 emit 或监听对该协议的支持是opt-in的要求使用标准能力webSocketUrl。webSocketUrl是 Appium base driver 定义的标准能力所有 driver 继承在 Session Capabilities 与 Capabilities Reference 中的定义为Capability NameTypeDescriptionwebSocketUrlbooleanWhether BiDi protocol is enabled in the session两个使用细节webSocketUrl属于 W3C 标准能力能力表中的名称不带appium:前缀书写时保持裸名即可。appium:前缀是 Appium 扩展能力专用的webSocketUrl不在其列。能力一旦发送给服务器、会话启动之后就不能再更改。因此webSocketUrl必须随 new session 请求一起发送事后再加不生效。把能力写进会话创建以 WebdriverIOAppium 团队推荐的客户端库为例。先初始化 Node.js 项目并安装客户端npm init npm i --save-dev webdriverio然后新建test.js。下面的代码基于文档快速开始示例仅增加了webSocketUrl: true一行const {remote} require(webdriverio); const capabilities { platformName: Android, appium:automationName: UiAutomator2, appium:deviceName: Android, appium:appPackage: com.android.settings, appium:appActivity: .Settings, webSocketUrl: true, }; const wdOpts { hostname: process.env.APPIUM_HOST || localhost, port: parseInt(process.env.APPIUM_PORT, 10) || 4723, logLevel: info, capabilities, }; async function runTest() { const driver await remote(wdOpts); try { const appsItem await driver.$(//*[textApps]); await appsItem.click(); } finally { await driver.pause(1000); await driver.deleteSession(); } } runTest().catch(console.error);代码要点这组能力启动的是 Android 内置设置应用Settings app的会话webSocketUrl: true是相对原文档示例唯一新增的一行作用就是告诉服务器在该会话中启用 BiDi 协议服务器地址可通过环境变量APPIUM_HOST、APPIUM_PORT覆盖未设置时默认localhost、端口4723与服务器启动日志中列出的 URL 一致运行node test.js。前提是 Appium 服务器已在另一个终端运行否则会得到连接失败的报错。确认 BiDi socket 已激活Appium 文档给出的直接判断依据是会话启动后检查返回的能力returned capabilities中是否带有活动的 BiDi socket示例字段即webSocketUrl能力这一检查方法出自文档的 driver 开发指南。对应到本场景new session 响应返回的能力集中出现webSocketUrl: true即表示该会话的 BiDi socket 已激活。如果结果不符合预期文档给出的另一个入口是服务器日志客户端请求新会话后Appium 服务器会记录该会话的所有细节直到会话结束排查会话问题时可以查看。启用后你就可以通过 websocket 发送 BiDi 命令。Appium base driver被所有 driver 继承支持的 BiDi 命令列在 BiDi Protocol API ReferenceBiDi 命令命令名作用bidiStatussession.status获取 Appium 服务器当前状态响应GetStatusResultbidiSubscribesession.subscribe订阅一个或多个 BiDi 事件bidiUnsubscribesession.unsubscribe取消订阅一个或多个 BiDi 事件session.subscribe/session.unsubscribe的参数如下名称说明类型默认值contexts?订阅/取消订阅事件的上下文范围默认应用全局范围string[][]events要订阅/取消订阅的事件名列表string[]两个命令的响应均为null。最后明确边界与 WebDriver Classic 命令一样各 Appium driver 和 plugin 可以各自定义自己支持的标准或自定义 BiDi 命令。webSocketUrl只负责打开通道某条具体 BiDi 命令是否可用取决于会话中实际使用的 driver 与 plugin需参考它们各自的文档确认。【免费下载链接】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),仅供参考