拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Appium 中的 Mobile JSON Wire Protocol(MJSONWP)遗留端点完全指南:从路由实现到现代化迁移

Appium 中的 Mobile JSON Wire ProtocolMJSONWP遗留端点完全指南从路由实现到现代化迁移【免费下载链接】appiumCross-platform automation framework for all kinds of apps, built on top of the W3C WebDriver protocol项目地址: https://gitcode.com/GitHub_Trending/ap/appiumMJSONWPMobile JSON Wire Protocol是 Appium 为移动端测试扩展出的早期 JSON Wire Protocol 变体本指南以 packages/appium/docs/en/reference/api/mjsonwp.md 为骨架完整梳理其在 Appium 中仍被支持的 7 个遗留端点设备旋转、应用上下文、网络连接并结合 路由定义源码 与 参数校验实现 讲解底层原理。读完你将掌握这些端点的请求/响应格式、合法取值表以及官方推荐的迁移路径Appium Protocol 端点与驱动扩展方法能够安全地在遗留脚本与现代化代码之间做切换。背景MJSONWP 是什么为何它还存在于 AppiumMobile JSON Wire Protocol 源自 Selenium 社区早期为移动端自动化起草的规范草案mobile-spec spec-draft。在 W3C WebDriver 规范正式落地之前Appium 基于 JSON Wire ProtocolJWP实现了大量移动端专属命令其中面向移动设备的部分即被称为 MJSONWP。从当前仓库源码可以看到Appium 并没有彻底删除这些旧路由而是将它们集中在 packages/base-driver/lib/protocol/routes/mjsonwp.ts 中统一声明并且每一条路由都被显式标记为deprecated: true/session/:sessionId/rotation: { GET: {command: getRotation, deprecated: true}, POST: {command: setRotation, payloadParams: {required: [x, y, z]}, deprecated: true}, },这说明 MJSONWP 端点仍可在 Appium 服务器上被调用保证历史客户端的兼容性但官方文档与源码均强烈建议迁移到新的 Appium Protocol 或驱动特定的扩展方法。本文档所描述的全部端点均位于会话作用域下路径以/session/:sessionId为前缀。设备旋转端点getRotation 与 setRotationgetRotation — 获取设备当前空间朝向GET /session/:sessionId/rotation该端点检索被测设备当前的空间朝向spatial orientation返回一个名为Rotation的对象包含三个数值属性| Name | Description | Type | | -- | -- | -- | |x| Degrees by which the device is rotated on its X axis | number | |y| Degrees by which the device is rotated on its Y axis | number | |z| Degrees by which the device is rotated on its Z axis | number |这三个值分别表示设备绕 X、Y、Z 轴旋转的角度单位度。setRotation — 设置设备空间朝向POST /session/:sessionId/rotation该端点设置被测设备的空间朝向。请求体需要同时提供三个必填参数| Name | Description | Type | | -- | -- | -- | |x| Degrees by which the device is rotated on its X axis | number | |y| Degrees by which the device is rotated on its Y axis | number | |z| Degrees by which the device is rotated on its Z axis | number |请求体示例{ x: 0, y: 0, z: 90 }成功时返回null。从 路由定义 可以看到payloadParams中required: [x, y, z]表明这三个参数在参数校验阶段即被强制要求缺失任何一个都会导致请求失败。迁移建议官方标注 Deprecated文档明确标注这两个端点已弃用请改用 getAppiumRotation / setAppiumRotation其请求与响应结构完全一致只是路径更换为 Appium 命名空间GET /session/:sessionId/appium/device/rotation POST /session/:sessionId/appium/device/rotation新路由在 packages/base-driver/lib/protocol/routes/appium-device.ts 中定义同样要求x、y、z三个必填参数。应用上下文端点getCurrentContext、setContext 与 getContexts上下文Context概念在移动端混合应用Hybrid App测试中应用可能同时包含原生视图与 WebView。Appium 将每个可交互的视图环境称为一个上下文context例如NATIVE_APP表示原生视图WEBVIEW_package表示某个 WebView。MJSONWP 提供以下三个端点管理上下文的查询与切换。getCurrentContext — 获取当前活动上下文GET /session/:sessionId/context返回string类型的当前活动上下文名称例如NATIVE_APP。setContext — 切换活动上下文POST /session/:sessionId/context将指定上下文设为当前活动上下文。请求体参数| Name | Description | Type | | -- | -- | -- | |name| Name of the context to set as the active one | string |请求体示例{ name: WEBVIEW_com.example.app }成功时返回null。路由源码中payloadParams: {required: [name]}见 mjsonwp.ts强制要求name参数。getContexts — 获取全部可用上下文GET /session/:sessionId/contexts返回string[]类型即所有可用上下文的名称列表例如[NATIVE_APP, WEBVIEW_com.example.app]迁移建议官方标注 Deprecated三个上下文端点均被标记为 Deprecated官方建议改用 Appium Protocol 中的对应端点getCurrentAppiumContextGET /session/:sessionId/appium/contextsetAppiumContextPOST /session/:sessionId/appium/contextgetAppiumContextsGET /session/:sessionId/appium/contexts新路由定义在 packages/base-driver/lib/protocol/routes/appium.ts 中请求/响应结构与 MJSONWP 版本完全一致仅路径命名空间不同。注意 Appium Protocol 版本不再带deprecated标记。网络连接端点getNetworkConnection 与 setNetworkConnectiongetNetworkConnection — 查询网络状态GET /session/:sessionId/network_connection检索当前网络类型状态数据连接、Wi-Fi、飞行模式返回值为一个表示NetworkConnectionState的数字。该数字是三种网络开关按位组合的结果官方文档给出了完整取值表| Value | Data | Wi-Fi | Airplane Mode | | -- | -- | -- | -- | |0| OFF | OFF | OFF | |1| OFF | OFF | ON | |2| OFF | ON | OFF | |4| ON | ON | OFF | |6| ON | ON | OFF |需要特别说明取值表采用位掩码思想——飞行模式占位1Wi-Fi 占位2数据连接占位4理论上的组合值如3、5、7在 参数校验器 中是不被允许的实际合法值仅限0、1、2、4、6。setNetworkConnection — 设置网络状态POST /session/:sessionId/network_connection设置网络类型状态。与其他端点不同该端点的参数被包裹在一个parameters键中| Name | Description | Type | | -- | -- | -- | |parameters| Object containing thetypekey, whose value is the desired network state |{type: NetworkConnectionState}|请求体示例{ parameters: { type: 1 } }成功时返回新的NetworkConnectionState数字。底层实现unwrap 参数解包机制为什么setNetworkConnection的参数要包一层parameters这源于 JSON Wire Protocol 时代的历史约定。在 packages/base-driver/lib/protocol/routes/mjsonwp.ts 中可以看到/session/:sessionId/network_connection: { GET: {command: getNetworkConnection, deprecated: true}, POST: { command: setNetworkConnection, payloadParams: {unwrap: parameters, required: [type]}, deprecated: true, }, },其中unwrap: parameters会在请求处理管线中触发 protocol.ts 里的unwrapParams函数将{parameters: {type: 1}}解包为{type: 1}再交给校验器验证并分发给驱动实现。这保证了驱动侧收到的参数结构统一也解释了为何客户端必须遵循这一包裹格式。同时type值在进入驱动之前会经过 validators.ts 的严格校验setNetworkConnection: (type: any) { if (!isNumber(type) || [0, 1, 2, 4, 6].indexOf(type) -1) { throw new Error(Network type must be one of 0, 1, 2, 4, 6); } },传入0、1、2、4、6之外的任何值包括字符串形式的数字以外的类型都会直接抛出Network type must be one of 0, 1, 2, 4, 6错误。迁移建议官方标注 Deprecated这两个端点同样被标记为 Deprecated官方文档建议改用驱动特定的扩展方法execute method例如mobile: getConnectivity与mobile: setConnectivity。与旋转、上下文端点不同网络连接没有对应的 Appium Protocol 统一端点因为不同平台Android / iOS的网络能力差异较大官方选择将实现下放给具体驱动以mobile:前缀的扩展方法形式提供。具体方法名与参数请参阅你所使用驱动的文档。为什么保留 Deprecated 端点兼容性设计解读从架构角度看MJSONWP 路由与 Appium Protocol 路由并存体现了 Appium 的多协议兼容设计统一命令分发新旧路由虽然路径不同但最终都映射到相同的命令处理器如getRotation同时被 MJSONWP 与 Appium 路由引用见 appium-device.ts 与 mjsonwp.ts。驱动只需实现一次命令逻辑多协议入口自动复用。渐进式迁移deprecated: true标记使旧端点仍可调用避免破坏存量测试脚本同时通过文档与路由标记引导新代码使用标准化端点。历史参数格式适配unwrap/wrap机制见 protocol.ts正是为兼容 JWP/MJSONWP 时代参数包一层键的调用习惯而设计的通用参数适配层。因此如果你正在维护历史脚本MJSONWP 端点仍然可用如果是新项目建议直接使用 Appium Protocol 端点 与驱动扩展方法。端点速查总表| 端点 | 方法 | 路径 | 必填参数 | 响应 | 官方迁移方案 | | -- | -- | -- | -- | -- | -- | | getRotation | GET |/session/:sessionId/rotation| — |Rotation对象x/y/z |getAppiumRotation| | setRotation | POST |/session/:sessionId/rotation|x、y、z|null|setAppiumRotation| | getCurrentContext | GET |/session/:sessionId/context| — |string上下文名 |getCurrentAppiumContext| | setContext | POST |/session/:sessionId/context|name|null|setAppiumContext| | getContexts | GET |/session/:sessionId/contexts| — |string[]上下文名列表 |getAppiumContexts| | getNetworkConnection | GET |/session/:sessionId/network_connection| — |NetworkConnectionState0/1/2/4/6 |mobile: getConnectivity| | setNetworkConnection | POST |/session/:sessionId/network_connection|parameters.type0/1/2/4/6 |NetworkConnectionState|mobile: setConnectivity|上述全部端点在 packages/base-driver/lib/protocol/routes/mjsonwp.ts 中定义并标记为 deprecated迁移后的 Appium Protocol 端点完整列表见 Appium Protocol 参考文档各端点所属协议分组可参考 API Endpoints 总览。在编写客户端代码时推荐通过官方 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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门