Appium API 端点参考指南:W3C WebDriver、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
Appium 主模块通过其 base driver 对外暴露一套完整的 HTTP API 端点,并按协议分组管理。本篇基于 Appium 官方文档中的 API 端点参考(index.md)整理成文,覆盖 WebDriver、WebDriver BiDi、JSON Wire、Mobile JSON Wire、Appium 扩展协议以及官方插件端点的核心定义、参数与响应结构,并结合base-driver源码剖析端点路由、参数校验与协议协商的底层实现,帮助你在调试自动化服务、开发客户端插件或排查 HTTP 交互问题时建立完整的端点地图。
Appium 端点的协议分组
Appium 所有 API 端点按其所属协议分组,除各协议外,还单独为插件端点设立了一个分组:
| 协议分组 | 说明 | 文档位置 |
|---|---|---|
| WebDriver Protocol | W3C WebDriver 协议端点,是 Appium 的主力协议 | webdriver.md |
| WebDriver BiDi Protocol | 基于 WebSocket 事件的双向协议命令 | bidi.md |
| JSON Wire Protocol | 遗留的 JSON Wire 协议端点(多已弃用) | jsonwp.md |
| Mobile JSON Wire Protocol | 遗留的移动端 JSON Wire 协议端点 | mjsonwp.md |
| Appium Protocol | Appium 对 W3C WebDriver 协议的扩展端点 | appium.md |
| Other Protocols | 其他协议端点 | others.md |
| Endpoints Used by Official Plugins | 官方插件新增/修改的端点 | plugins.md |
需要特别强调的是两个使用前提:
- 所有 Appium driver 都继承 Appium base driver,因此它们天然支持 base driver 的全部端点,同时可以各自额外定义私有端点。了解某个 driver 的具体端点,请查阅对应 driver 的文档(drivers 文档入口)。
- 官方推荐通过 Appium client 调用这些端点,而不是直接发送裸 HTTP 请求。不同 client(WebdriverIO、Selenium、Appium-Python-Client 等)封装的调用方式不同,需查阅各自文档(clients 文档入口)。
端点体系的底层实现:从源码看请求如何被路由
从源码结构看,端点定义、路由注册与请求处理集中在base-driver包的 protocol 模块中:
路由方法映射表:各协议的命令与 URL 路由的映射定义在 routes 目录下,按协议拆分——w3c.ts 定义 W3C 端点、jsonwp.ts 定义 JSONWP 端点、appium.ts 与 appium-device.ts 定义 Appium 扩展端点。routes/index.ts 汇总为统一的
METHOD_MAP,并维护NO_SESSION_ID_COMMANDS(不需要会话 ID 的命令集合)。协议协商:在 protocol.ts 中,
determineProtocol函数会检查 new-session 请求体中是否包含 W3C capabilities(通过isW3cCaps判断),据此决定按 W3C 还是 MJSONWP 协议处理:export function determineProtocol(createSessionArgs: any[]): keyof typeof PROTOCOLS { return createSessionArgs.some(isW3cCaps) ? PROTOCOLS.W3C : PROTOCOLS.MJSONWP; }会话 ID 提取:
getSessionId从 Express 路由参数中取出sessionId;如果路由被误写为通配符/session/*sessionId导致参数变成数组,它会取第一个元素并输出告警日志提示修正路由定义——这解释了为什么文档中所有会话级端点都统一写成/session/:sessionId形式。参数校验:
checkParams依据METHOD_MAP中每个命令声明的required/optional参数表(支持多组可选必填参数的形式)校验请求体,并可挂载自定义validate函数;校验失败会抛出InvalidArgumentError。HTTP 层挂载:端点最终通过 express/server.ts 注册的 Express 中间件暴露到服务上,
listCommands类元命令则由 protocol 层直接实现,用于向客户端枚举当前会话支持的端点。
理解了这套机制后,就可以把各协议文档中的端点视为“方法名 → URL 路由 + 参数声明 + 校验规则”的声明式映射。
WebDriver 协议核心端点
webdriver.md 列出了 Appium 支持的 W3C WebDriver 端点全表。官方文档特别提醒:多数 WebDriver 端点并不在 Appium 本体中实现,而是直接代理(proxy)到具体 driver,由 driver 负责实际执行。以下为按功能域整理的端点总览:
会话生命周期
| 端点 | 方法与路径 | 关键参数 | 响应 |
|---|---|---|---|
| createSession | POST /session | W3C capabilities(见下方说明) | sessionId+capabilities |
| deleteSession | DELETE /session/:sessionId | - | null |
| getStatus | GET /status | - | {build, message, ready} |
| getTimeouts / timeouts | GET/POST /session/:sessionId/timeouts | implicit?、pageLoad?、script?(毫秒) | null/{command, implicit} |
createSession 的历史包袱:W3C 规范只接受 1 个参数,但 Appium 为实现历史兼容允许最多 3 个参数位置携带 capabilities(这是遗留 JSONWP 的要求)。自 Appium 2 起 JSONWP 格式已不再支持,三个位置中的任意一个都可以用来传 W3C capabilities。响应对象CreateResult包含sessionId(字符串)和capabilities(driver 处理后的能力对象)。
getStatus 的 Appium 定制:build字段在 Appium 中是一个包含version键的对象,其值即 Appium 服务版本;ready表示服务当前是否还能创建新会话;message是对ready值的解释。
导航与窗口管理
| 端点 | 方法与路径 | 说明 |
|---|---|---|
| setUrl / getUrl | POST/GET /session/:sessionId/url | 导航到指定 URL / 获取当前 URL |
| back / forward / refresh | POST /session/:sessionId/{back,forward,refresh} | 浏览器历史前进后退 / 刷新 |
| title | GET /session/:sessionId/title | 获取页面标题 |
| getWindowHandle / setWindow / closeWindow / getWindowHandles | GET/POST/DELETEGET /session/:sessionId/window* | 窗口句柄的获取、切换、关闭与枚举 |
| createNewWindow | POST /session/:sessionId/window/new | 参数type(window或tab),返回{handle, type} |
| getWindowRect / setWindowRect | GET/POST /session/:sessionId/window/rect | 获取/设置窗口尺寸位置,返回Rect{x, y, width, height} |
| maximizeWindow / minimizeWindow / fullScreenWindow | POST /session/:sessionId/window/{maximize,minimize,fullscreen} | 窗口最大化/最小化/全屏,均返回Rect |
| setFrame / switchToParentFrame | POST /session/:sessionId/frame{,/parent} | 帧切换;frame的参数id可为null、数字或元素 |
元素查找与属性读取
元素统一以Element对象表示,含两个等价的 ID 键:element-6066-11e4-a52e-4f735466cecf(W3C 标准键)和ELEMENT(遗留 MJSONWP 键)。
| 端点 | 方法与路径 | 说明 |
|---|---|---|
| findElement / findElements | POST /session/:sessionId/{element,elements} | 从根节点查找,参数using(定位策略)+value(选择器) |
| findElementFromElement / findElementsFromElement | POST /session/:sessionId/element/:elementId/{element,elements} | 以指定元素为起点查找 |
| elementShadowRoot | GET /session/:sessionId/element/:elementId/shadow | 返回shadow-6066-11e4-a52e-4f735466cecf影子根 ID |
| findElementFromShadowRoot / findElementsFromShadowRoot | POST /session/:sessionId/shadow/:shadowId/{element,elements} | 以影子根为起点查找 |
| active | GET /session/:sessionId/element/active | 获取当前聚焦元素 |
| elementSelected / elementDisplayed / elementEnabled | GET /session/:sessionId/element/:elementId/{selected,displayed,enabled} | 布尔状态查询,仅对特定元素类型有意义 |
| getAttribute / getProperty / getCssProperty | GET /session/:sessionId/element/:elementId/{attribute,property,css}/:name | 属性/特性/CSS 计算值,不存在时返回null |
| getText / getName / getElementRect | GET /session/:sessionId/element/:elementId/{text,name,rect} | 文本(含子元素)、标签名、尺寸坐标 |
| getComputedRole / getComputedLabel | GET /session/:sessionId/element/:elementId/{computedrole,computedlabel} | WAI-ARIA 计算角色 / 可访问名称 |
元素交互、脚本与提示框
| 端点 | 方法与路径 | 说明 |
|---|---|---|
| click / clear / setValue | POST /session/:sessionId/element/:elementId/{click,clear,value} | 点击 / 清空 / 输入(setValue参数text) |
| getPageSource | GET /session/:sessionId/source | 获取 HTML/XML 格式的页面/应用源码 |
| execute / executeAsync | POST /session/:sessionId/execute/{sync,async} | 同步/异步执行 JS,参数script+args;异步脚本额外收到一个完成回调函数,其第一个入参即为响应值 |
| getCookies / getCookie / setCookie / deleteCookie(s) | GET/POST/DELETE /session/:sessionId/cookie* | Cookie 增删查;Cookie 对象字段含name、value、domain?、path?、expiry?(Unix 秒级时间戳)、httpOnly?、secure?、sameSite?(Lax或Strict) |
| performActions / releaseActions | POST/DELETE /session/:sessionId/actions | 执行 W3C 动作序列(ActionSequence[])/ 释放所有已按下按键与指针按钮 |
| postDismissAlert / postAcceptAlert | POST /session/:sessionId/alert/{dismiss,accept} | 关闭/接受当前用户提示框 |
| getAlertText / setAlertText | GET/POST /session/:sessionId/alert/text | 获取/设置提示框文本 |
截图与打印
| 端点 | 方法与路径 | 响应 |
|---|---|---|
| getScreenshot | GET /session/:sessionId/screenshot | base64 编码的 PNG |
| getElementScreenshot | GET /session/:sessionId/element/:elementId/screenshot | 元素包围矩形区域截图,base64 PNG |
| printPage | POST /session/:sessionId/print | base64 编码的 PDF |
printPage支持丰富的打印参数(均为可选并带默认值):
| 参数 | 说明 | 默认值 |
|---|---|---|
orientation? | 页面方向(portrait/landscape) | portrait |
scale? | 页面缩放,范围[0.1, 2] | 1 |
background? | 是否包含背景图 | false |
page? | 页面尺寸对象PrintPageSize:width?(≥ 2.54/72,默认 21.59)、height?(≥ 2.54/72,默认 27.94) | {} |
margin? | 页边距对象PrintPageMargins:top/bottom/left/right?(均 ≥ 0,默认1) | {} |
shrinkToFit? | 是否按PrintPageSize.width缩放内容 | true |
pageRanges? | 打印页码范围,如[1, 4, '8-9'] | [] |
Appium 协议扩展端点
appium.md 定义了 Appium 在 W3C WebDriver 之上扩展出的端点。这些端点是移动自动化场景的核心能力来源:
会话元信息与设置
| 端点 | 方法与路径 | 说明 |
|---|---|---|
| getAppiumSessions | GET /appium/sessions | 列出所有活跃会话(id、capabilities、created毫秒时间戳)。必须启用session_discovery不安全特性 才可用 |
| getAppiumSessionCapabilities | GET /session/:sessionId/appium/capabilities | 获取会话能力(返回{capabilities}) |
| getSettings / updateSettings | GET/POST /session/:sessionId/appium/settings | 获取/更新会话设置;更新时只改指定项,其余保持不变 |
| listCommands | GET /session/:sessionId/appium/commands | 列出当前会话支持的全部 URL 端点与 BiDi 命令,按来源分组(Appium 基础 / driver / 插件),结构见 packages/types/lib/commands/appium.ts |
| listExtensions | GET /session/:sessionId/appium/extensions | 列出当前会话支持的 execute methods,按 driver/插件分组 |
事件日志
| 端点 | 方法与路径 | 说明 |
|---|---|---|
| getLogEvents | POST /session/:sessionId/appium/events | 获取会话事件历史;参数type?(字符串或字符串数组)可按类型过滤 |
| logCustomEvent | POST /session/:sessionId/appium/log_event | 记录自定义事件;参数vendor(命名空间前缀)+event(事件名) |
getLogEvents默认记录 driver 命令执行,driver/插件可定义额外事件类型。响应对象EventHistory的键即事件类型,分三类:
{ "commands": [ { "cmd": "getStatus", "startTime": 1756887645447, "endTime": 1756887645454 } ], "driverevent": [1756887645454], "namespace:event": [1756887645454] }commands键始终存在,数组元素含cmd(命令名)、startTime/endTime(毫秒 Unix 时间戳);- 其他无命名空间键由 driver/插件实现自定义,值为事件时间戳数组;
- 命名空间键(
namespace:event)可通过logCustomEvent添加,driver/插件也可能自带。
上下文(Context)管理
| 端点 | 方法与路径 | 响应 |
|---|---|---|
| getCurrentAppiumContext | GET /session/:sessionId/appium/context | 当前活跃上下文名 |
| setAppiumContext | POST /session/:sessionId/appium/context(参数name) | null |
| getAppiumContexts | GET /session/:sessionId/appium/contexts | 可用上下文名数组 |
设备与应用生命周期
| 端点 | 方法与路径 | 关键参数 / 响应 |
|---|---|---|
| getDeviceTime | POST /session/:sessionId/appium/device/system_time | format?默认YYYY-MM-DDTHH:mm:ssZ |
| activateApp | POST .../appium/device/activate_app | appId或bundleId+options? |
| terminateApp | POST .../appium/device/terminate_app | 同上 |
| queryAppState | POST .../appium/device/app_state | 返回整数:0=未安装,1=未运行,2=后台挂起,3=后台运行,4=前台运行 |
| installApp | POST .../appium/device/install_app | appPath(本地绝对路径或 URL)+options? |
| removeApp | POST .../appium/device/remove_app | 返回boolean |
| isAppInstalled | POST .../appium/device/app_installed | 返回boolean |
| hideKeyboard | POST .../appium/device/hide_keyboard | key?、keyCode?、keyName?、strategy?;返回boolean(部分平台可能永不返回false) |
| isKeyboardShown | GET .../appium/device/is_keyboard_shown | 返回boolean |
| pushFile | POST .../appium/device/push_file | data(Base64)+path(设备端目标路径) |
| pullFile | POST .../appium/device/pull_file | path;返回文件内容的 Base64 |
| pullFolder | POST .../appium/device/pull_folder | path;返回目录打包为 zip 后的 Base64 |
| getAppiumRotation / setAppiumRotation | GET/POST .../appium/device/rotation | 三维旋转角x/y/z(度数) |
| getAppiumOrientation / setAppiumOrientation | GET/POST .../appium/device/orientation | PORTRAIT或LANDSCAPE |
以上端点路径均以POST /session/:sessionId/appium/device/...为前缀(除特别说明外)。
WebDriver BiDi 命令
bidi.md 列出的 WebDriver BiDi 命令与 URL 端点不同——它们是以 WebSocket 事件形式发送的命令,driver 和 client 双方都可以发出或监听:
| 命令 | 说明 | 参数 |
|---|---|---|
session.status | 获取 Appium 服务当前状态,响应结构同 WebDriver 的getStatus | - |
session.subscribe | 订阅一个或多个 BiDi 事件 | events(事件名数组,必填);contexts?(订阅作用域,默认全局['']) |
session.unsubscribe | 退订一个或多个 BiDi 事件 | 参数同上 |
遗留 JSON Wire 协议端点
jsonwp.md 记录了 Appium 仍兼容的 JSONWP 遗留端点。其中大部分已被标记弃用,官方给出了明确的迁移替代:
| 遗留端点 | 方法与路径 | 弃用替代 |
|---|---|---|
| getSession | GET /session/:sessionId | 获取能力请用getAppiumSessionCapabilities;获取事件历史请用getLogEvents(注意:若设置appium:eventTimingscapability 为true,响应会额外携带events键) |
| availableIMEEngines | GET /session/:sessionId/ime/available_engines | 未来将移入 UiAutomator2/Espresso driver |
| getActiveIMEEngine | GET /session/:sessionId/ime/active_engine | 同上 |
| isIMEActivated | GET /session/:sessionId/ime/activated | 同上 |
| deactivateIMEEngine | POST /session/:sessionId/ime/deactivate | 同上 |
| activateIMEEngine | POST /session/:sessionId/ime/activate(参数engine) | 同上 |
| getOrientation / setOrientation | GET/POST /session/:sessionId/orientation | getAppiumOrientation/setAppiumOrientation |
| getGeoLocation / setGeoLocation | GET/POST /session/:sessionId/location(Location{altitude, latitude, longitude}) | driver 专属扩展方法,如mobile: getGeoLocation、mobile: setSimulatedLocation |
新建项目应直接使用 Appium 协议端点或 driver 扩展方法,避免再依赖 JSONWP 路由。
官方插件提供的端点
plugins.md 汇总了官方插件新增或修改的端点:
Execute Driver 插件
executeDriverScript(POST /session/:sessionId/appium/execute_driver)在子进程中执行 driver 脚本:
| 参数 | 说明 | 默认值 |
|---|---|---|
script | 要执行的脚本 | - |
type? | 执行脚本的库名 | webdriverio |
timeout? | 脚本进程超时(毫秒) | 3600000 |
响应RunScriptResult含result(脚本返回值)与logs(执行日志)。
Images 插件
compareImages(POST /session/:sessionId/appium/compare_images):按三种模式比较图像——matchFeatures:判断firstImage是否为secondImage的旋转/缩放/变换版本。options 支持detectorName?(OpenCV 特征检测器:AKAZE、AgastFeatureDetector、BRISK、FastFeatureDetector、GFTTDetector、KAZE、MSER、ORB,默认ORB)、goodMatchesFactor?、matchFunc?(FlannBased/BruteForce系列,默认BruteForce)、visualize?(默认false)。matchTemplate:判断firstImage是否包含secondImage的一个或多个实例。options 支持method?(TM_CCOEFF、TM_CCOEFF_NORMED、TM_CCORR、TM_CCORR_NORMED、TM_SQDIFF、TM_SQDIFF_NORMED,默认TM_CCOEFF_NORMED)、threshold?(默认0.5)、multiple?(默认false)、matchNeighbourThreshold?(默认10)、visualize?。getSimilarity:对等尺寸图像计算相似度分数(0.0–1.0)。- 各模式响应均含匹配点/包围矩形(
rect{x, y, width, height})、score与可选的visualization图像。
- 修改
findElement/findElements:为using(定位策略)参数新增-image取值,实现图像定位。 - 修改
performActions:当动作中的origin是图像元素时,会移除origin并把x/y偏移为该图像元素的中心坐标。
Relaxed Caps 插件
修改createSession:对capabilities中的键自动补加appium:前缀,除非该键已是标准 W3C 能力或已带任意前缀。
Storage 插件
所有端点无需创建会话即可调用,适合预先准备测试环境。插件 1.2.0 之前的/storage前缀路由(如/storage/add)仍可用但已弃用,将在未来版本移除:
| 端点 | 方法与路径 | 说明 |
|---|---|---|
| addStorageItem | POST /appium/storage/add | 参数name(不得含路径分隔符)+sha1;响应含ttlMs(WebSocket 存活/上传成功窗口,毫秒)、ws.stream(内容流上传路径)、ws.events(成功/失败通知路径) |
| deleteStorageItem | POST /appium/storage/delete | 参数name;返回boolean(文件不存在或请求无效时为false) |
| listStorageItems | GET /appium/storage/list | 返回{name, path, size}列表 |
| resetStorage | POST /appium/storage/reset | 删除全部已上传文件并中断未完成上传;若设置APPIUM_STORAGE_KEEP_ALL环境变量则保留全部文件,仅停止未完成上传 |
addStorageItem的响应示例:
{ "ws": { "stream": "/appium/storage/add/ccc963411b2621335657963322890305ebe96186/stream", "events": "/appium/storage/add/ccc963411b2621335657963322890305ebe96186/events" }, "ttlMs": 300000 }Universal XML 插件
- 修改
findElement/findElements:value(选择器)参数支持跨平台的通用节点/属性名; - 修改
getPageSource:在获取页面源码后,将节点/属性名转换为通用名称。
调用建议与深入阅读
- 优先使用 client 封装:直接调用 HTTP 端点主要用于调试与元信息发现(如
listCommands、getLogEvents),日常测试请通过各语言的 Appium client 发起请求。 - 端点能力自省:运行时可通过
GET /session/:sessionId/appium/commands与/appium/extensions动态枚举当前 driver + 插件组合实际暴露的全部端点,这是排查“端点不支持”类问题最直接的手段。 - 继续深入:
- 端点协议定义细节:webdriver.md、appium.md、jsonwp.md、bidi.md
- 会话与能力概念:caps 指南、event-timing 指南、context 指南
- 路由与参数校验实现:protocol.ts、routes 目录
【免费下载链接】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),仅供参考