Appium API 端点参考指南:W3C WebDriver、Appium 协议扩展与官方插件端点体系
2026/9/13 13:54:08 网站建设 项目流程

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 ProtocolW3C 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 ProtocolAppium 对 W3C WebDriver 协议的扩展端点appium.md
Other Protocols其他协议端点others.md
Endpoints Used by Official Plugins官方插件新增/修改的端点plugins.md

需要特别强调的是两个使用前提:

  1. 所有 Appium driver 都继承 Appium base driver,因此它们天然支持 base driver 的全部端点,同时可以各自额外定义私有端点。了解某个 driver 的具体端点,请查阅对应 driver 的文档(drivers 文档入口)。
  2. 官方推荐通过 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 负责实际执行。以下为按功能域整理的端点总览:

会话生命周期

端点方法与路径关键参数响应
createSessionPOST /sessionW3C capabilities(见下方说明)sessionId+capabilities
deleteSessionDELETE /session/:sessionId-null
getStatusGET /status-{build, message, ready}
getTimeouts / timeoutsGET/POST /session/:sessionId/timeoutsimplicit?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 / getUrlPOST/GET /session/:sessionId/url导航到指定 URL / 获取当前 URL
back / forward / refreshPOST /session/:sessionId/{back,forward,refresh}浏览器历史前进后退 / 刷新
titleGET /session/:sessionId/title获取页面标题
getWindowHandle / setWindow / closeWindow / getWindowHandlesGET/POST/DELETEGET /session/:sessionId/window*窗口句柄的获取、切换、关闭与枚举
createNewWindowPOST /session/:sessionId/window/new参数typewindowtab),返回{handle, type}
getWindowRect / setWindowRectGET/POST /session/:sessionId/window/rect获取/设置窗口尺寸位置,返回Rect{x, y, width, height}
maximizeWindow / minimizeWindow / fullScreenWindowPOST /session/:sessionId/window/{maximize,minimize,fullscreen}窗口最大化/最小化/全屏,均返回Rect
setFrame / switchToParentFramePOST /session/:sessionId/frame{,/parent}帧切换;frame的参数id可为null、数字或元素

元素查找与属性读取

元素统一以Element对象表示,含两个等价的 ID 键:element-6066-11e4-a52e-4f735466cecf(W3C 标准键)和ELEMENT(遗留 MJSONWP 键)。

端点方法与路径说明
findElement / findElementsPOST /session/:sessionId/{element,elements}从根节点查找,参数using(定位策略)+value(选择器)
findElementFromElement / findElementsFromElementPOST /session/:sessionId/element/:elementId/{element,elements}以指定元素为起点查找
elementShadowRootGET /session/:sessionId/element/:elementId/shadow返回shadow-6066-11e4-a52e-4f735466cecf影子根 ID
findElementFromShadowRoot / findElementsFromShadowRootPOST /session/:sessionId/shadow/:shadowId/{element,elements}以影子根为起点查找
activeGET /session/:sessionId/element/active获取当前聚焦元素
elementSelected / elementDisplayed / elementEnabledGET /session/:sessionId/element/:elementId/{selected,displayed,enabled}布尔状态查询,仅对特定元素类型有意义
getAttribute / getProperty / getCssPropertyGET /session/:sessionId/element/:elementId/{attribute,property,css}/:name属性/特性/CSS 计算值,不存在时返回null
getText / getName / getElementRectGET /session/:sessionId/element/:elementId/{text,name,rect}文本(含子元素)、标签名、尺寸坐标
getComputedRole / getComputedLabelGET /session/:sessionId/element/:elementId/{computedrole,computedlabel}WAI-ARIA 计算角色 / 可访问名称

元素交互、脚本与提示框

端点方法与路径说明
click / clear / setValuePOST /session/:sessionId/element/:elementId/{click,clear,value}点击 / 清空 / 输入(setValue参数text
getPageSourceGET /session/:sessionId/source获取 HTML/XML 格式的页面/应用源码
execute / executeAsyncPOST /session/:sessionId/execute/{sync,async}同步/异步执行 JS,参数script+args;异步脚本额外收到一个完成回调函数,其第一个入参即为响应值
getCookies / getCookie / setCookie / deleteCookie(s)GET/POST/DELETE /session/:sessionId/cookie*Cookie 增删查;Cookie 对象字段含namevaluedomain?path?expiry?(Unix 秒级时间戳)、httpOnly?secure?sameSite?LaxStrict
performActions / releaseActionsPOST/DELETE /session/:sessionId/actions执行 W3C 动作序列(ActionSequence[])/ 释放所有已按下按键与指针按钮
postDismissAlert / postAcceptAlertPOST /session/:sessionId/alert/{dismiss,accept}关闭/接受当前用户提示框
getAlertText / setAlertTextGET/POST /session/:sessionId/alert/text获取/设置提示框文本

截图与打印

端点方法与路径响应
getScreenshotGET /session/:sessionId/screenshotbase64 编码的 PNG
getElementScreenshotGET /session/:sessionId/element/:elementId/screenshot元素包围矩形区域截图,base64 PNG
printPagePOST /session/:sessionId/printbase64 编码的 PDF

printPage支持丰富的打印参数(均为可选并带默认值):

参数说明默认值
orientation?页面方向(portrait/landscapeportrait
scale?页面缩放,范围[0.1, 2]1
background?是否包含背景图false
page?页面尺寸对象PrintPageSizewidth?(≥ 2.54/72,默认 21.59)、height?(≥ 2.54/72,默认 27.94){}
margin?页边距对象PrintPageMarginstop/bottom/left/right?(均 ≥ 0,默认1{}
shrinkToFit?是否按PrintPageSize.width缩放内容true
pageRanges?打印页码范围,如[1, 4, '8-9'][]

Appium 协议扩展端点

appium.md 定义了 Appium 在 W3C WebDriver 之上扩展出的端点。这些端点是移动自动化场景的核心能力来源:

会话元信息与设置

端点方法与路径说明
getAppiumSessionsGET /appium/sessions列出所有活跃会话(idcapabilitiescreated毫秒时间戳)。必须启用session_discovery不安全特性 才可用
getAppiumSessionCapabilitiesGET /session/:sessionId/appium/capabilities获取会话能力(返回{capabilities}
getSettings / updateSettingsGET/POST /session/:sessionId/appium/settings获取/更新会话设置;更新时只改指定项,其余保持不变
listCommandsGET /session/:sessionId/appium/commands列出当前会话支持的全部 URL 端点与 BiDi 命令,按来源分组(Appium 基础 / driver / 插件),结构见 packages/types/lib/commands/appium.ts
listExtensionsGET /session/:sessionId/appium/extensions列出当前会话支持的 execute methods,按 driver/插件分组

事件日志

端点方法与路径说明
getLogEventsPOST /session/:sessionId/appium/events获取会话事件历史;参数type?(字符串或字符串数组)可按类型过滤
logCustomEventPOST /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)管理

端点方法与路径响应
getCurrentAppiumContextGET /session/:sessionId/appium/context当前活跃上下文名
setAppiumContextPOST /session/:sessionId/appium/context(参数namenull
getAppiumContextsGET /session/:sessionId/appium/contexts可用上下文名数组

设备与应用生命周期

端点方法与路径关键参数 / 响应
getDeviceTimePOST /session/:sessionId/appium/device/system_timeformat?默认YYYY-MM-DDTHH:mm:ssZ
activateAppPOST .../appium/device/activate_appappIdbundleId+options?
terminateAppPOST .../appium/device/terminate_app同上
queryAppStatePOST .../appium/device/app_state返回整数:0=未安装,1=未运行,2=后台挂起,3=后台运行,4=前台运行
installAppPOST .../appium/device/install_appappPath(本地绝对路径或 URL)+options?
removeAppPOST .../appium/device/remove_app返回boolean
isAppInstalledPOST .../appium/device/app_installed返回boolean
hideKeyboardPOST .../appium/device/hide_keyboardkey?keyCode?keyName?strategy?;返回boolean(部分平台可能永不返回false
isKeyboardShownGET .../appium/device/is_keyboard_shown返回boolean
pushFilePOST .../appium/device/push_filedata(Base64)+path(设备端目标路径)
pullFilePOST .../appium/device/pull_filepath;返回文件内容的 Base64
pullFolderPOST .../appium/device/pull_folderpath;返回目录打包为 zip 后的 Base64
getAppiumRotation / setAppiumRotationGET/POST .../appium/device/rotation三维旋转角x/y/z(度数)
getAppiumOrientation / setAppiumOrientationGET/POST .../appium/device/orientationPORTRAITLANDSCAPE

以上端点路径均以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 遗留端点。其中大部分已被标记弃用,官方给出了明确的迁移替代:

遗留端点方法与路径弃用替代
getSessionGET /session/:sessionId获取能力请用getAppiumSessionCapabilities;获取事件历史请用getLogEvents(注意:若设置appium:eventTimingscapability 为true,响应会额外携带events键)
availableIMEEnginesGET /session/:sessionId/ime/available_engines未来将移入 UiAutomator2/Espresso driver
getActiveIMEEngineGET /session/:sessionId/ime/active_engine同上
isIMEActivatedGET /session/:sessionId/ime/activated同上
deactivateIMEEnginePOST /session/:sessionId/ime/deactivate同上
activateIMEEnginePOST /session/:sessionId/ime/activate(参数engine同上
getOrientation / setOrientationGET/POST /session/:sessionId/orientationgetAppiumOrientation/setAppiumOrientation
getGeoLocation / setGeoLocationGET/POST /session/:sessionId/locationLocation{altitude, latitude, longitude}driver 专属扩展方法,如mobile: getGeoLocationmobile: setSimulatedLocation

新建项目应直接使用 Appium 协议端点或 driver 扩展方法,避免再依赖 JSONWP 路由。

官方插件提供的端点

plugins.md 汇总了官方插件新增或修改的端点:

Execute Driver 插件

executeDriverScriptPOST /session/:sessionId/appium/execute_driver)在子进程中执行 driver 脚本:

参数说明默认值
script要执行的脚本-
type?执行脚本的库名webdriverio
timeout?脚本进程超时(毫秒)3600000

响应RunScriptResultresult(脚本返回值)与logs(执行日志)。

Images 插件

  • compareImagesPOST /session/:sessionId/appium/compare_images):按三种模式比较图像——
    • matchFeatures:判断firstImage是否为secondImage的旋转/缩放/变换版本。options 支持detectorName?(OpenCV 特征检测器:AKAZEAgastFeatureDetectorBRISKFastFeatureDetectorGFTTDetectorKAZEMSERORB,默认ORB)、goodMatchesFactor?matchFunc?FlannBased/BruteForce系列,默认BruteForce)、visualize?(默认false)。
    • matchTemplate:判断firstImage是否包含secondImage的一个或多个实例。options 支持method?TM_CCOEFFTM_CCOEFF_NORMEDTM_CCORRTM_CCORR_NORMEDTM_SQDIFFTM_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)仍可用但已弃用,将在未来版本移除:

端点方法与路径说明
addStorageItemPOST /appium/storage/add参数name(不得含路径分隔符)+sha1;响应含ttlMs(WebSocket 存活/上传成功窗口,毫秒)、ws.stream(内容流上传路径)、ws.events(成功/失败通知路径)
deleteStorageItemPOST /appium/storage/delete参数name;返回boolean(文件不存在或请求无效时为false
listStorageItemsGET /appium/storage/list返回{name, path, size}列表
resetStoragePOST /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/findElementsvalue(选择器)参数支持跨平台的通用节点/属性名;
  • 修改getPageSource:在获取页面源码后,将节点/属性名转换为通用名称。

调用建议与深入阅读

  1. 优先使用 client 封装:直接调用 HTTP 端点主要用于调试与元信息发现(如listCommandsgetLogEvents),日常测试请通过各语言的 Appium client 发起请求。
  2. 端点能力自省:运行时可通过GET /session/:sessionId/appium/commands/appium/extensions动态枚举当前 driver + 插件组合实际暴露的全部端点,这是排查“端点不支持”类问题最直接的手段。
  3. 继续深入
    • 端点协议定义细节: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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询