WebDriver

W3C 工作草案

关于本文档的更多详细信息
此版本:
https://www.w3.org/TR/2026/WD-webdriver2-20260511/
最新发布版本:
https://www.w3.org/TR/webdriver2/
最新编辑草案:
https://w3c.github.io/webdriver/
历史:
https://www.w3.org/standards/history/webdriver2/
提交历史
测试套件:
https://wpt.live/webdriver/
实现报告:
https://wpt.fyi/results/webdriver
编辑:
Simon StewartApple
David BurnsBrowserStack
反馈:
GitHub w3c/webdriver拉取请求新建议题开放议题
频道
irc.w3.org 上的 #webdriver

摘要

WebDriver 是一种远程控制接口, 用于对用户代理进行自省和控制。 它提供一种平台和语言中立的有线协议, 作为进程外程序远程指示 Web 浏览器行为的方式。

它提供了一组接口, 用于发现和操纵 Web 文档中的 DOM 元素, 并控制用户代理的行为。 它主要旨在允许 Web 作者编写测试, 从单独的控制进程自动化用户代理, 但也可以采用允许浏览器内脚本 控制一个——可能是单独的——浏览器的方式使用。

本文档的状态

本节描述本文档在发布时的状态。当前 W3C 出版物列表以及本技术报告的最新修订版可以在 W3C 标准和草案 索引中找到。

本文档由 浏览器 测试和工具工作组发布为 使用 推荐标准 轨道的工作草案。

发布为 工作草案并不意味着 W3C 及其成员的认可。

这是一份草案文档,可能会随时被其他文档更新、替换或废弃。 除作为进行中的工作之外,不宜引用本文档。

本文档由一个依据 W3C 专利 政策 运作的小组制作。 W3C 维护着一个 公开的专利 披露列表, 其中列出了与该小组交付物相关的任何专利披露;该页面还包括 披露专利的说明。实际知晓某项专利且该个人认为该专利包含 必要权利要求的个人, 必须依据 W3C 专利政策第 6 节 披露该信息。

本文档受 2025 年 8 月 18 日 W3C 流程文档约束。

1. 设计

本节是非规范性的。

WebDriver 标准试图遵循若干设计目标:

1.1 兼容性

本规范派生自流行的 Selenium WebDriver 浏览器自动化框架。 Selenium 是一个长期存在的项目, 由于其历史悠久且使用范围广泛, 它具有范围广泛的预期功能。 本规范利用这些预期来指导其设计。 在作出改进或澄清之处, 均谨慎进行,以允许 Selenium WebDriver 的现有用户 避免意外的破坏。

1.2 简洁性

本规范预期的最大用户群体 是编写自动化测试和其他工具的软件开发人员和测试人员, 例如依赖于自动化浏览器的监控或负载测试。 因此,本规范谨慎地提供了命令, 以简化常见任务,例如向元素输入 以及点击元素。

1.3 扩展

WebDriver 提供了一种机制,供其他人定义协议扩展, 以自动化那些无法完全在 ECMAScript 中实现的功能。这允许其他 Web 标准支持新平台特性的自动化。它还 允许供应商公开其浏览器特有的功能。

2. 一致性

除标记为非规范性的章节外,本规范中的所有创作指南、图表、示例和注释也都是非规范性的。 本规范中的其他所有内容都是规范性的。

以算法或具体步骤表述的一致性要求 可以用任何方式实现, 只要最终结果等效即可。 本文档中的算法通常以可读性为考量编写, 而非以性能为考量。

3. 术语

在等式中,所有数字都是整数, 加法由 “+” 表示, 减法由 “−” 表示, 除法由 “÷” 表示, 按位或由 “|” 表示。 字符 “(” 和 “)” 在这些上下文中用于提供逻辑分组。

数学函数 min(value, value[, value]) 返回两个或更多值中的最小项。 反之,函数 max(value, value[, value]) 返回两个或更多值中的最大项。

数学函数 floor(value) 产生不大于 value 的、 最接近正无穷大的最大整数。

通用唯一标识符(UUID) 是一个 128 位长的 URN,不需要中心化注册过程。 生成 UUID 是指 从真正随机数或伪随机数创建 UUID, 并将其转换为字符串表示。 [RFC4122]

Unix Epoch 是一个近似表示自 Epoch 以来 已经过秒数的值, 如 The Open Group Base Specifications Issue 7 第 4.15 节(IEEE Std 1003.1)所述。

整数是一个在 Number,其在 ToInteger 操作下 保持不变。

ECMAScript 属性的初始值 是平台为该属性定义的值, 即在不存在任何内容脚本遮蔽的情况下它会具有的值。

浏览器 chrome 是一个非规范性术语, 指用户与用户代理本身交互所通过的表示, 区别于被访问的 Web 内容。 浏览器 chrome 元素的示例 包括但不限于: 工具栏(例如书签工具栏)、 菜单(例如文件菜单或上下文菜单)、 按钮(例如后退和前进按钮)、 门挂件(例如安全和证书指示器), 以及装饰(例如操作系统小部件边框)。

4. 接口

当用户代理处于远程控制之下时, webdriver-active 标志 被设为 true。 它最初为 false。

WebIDLinterface mixin NavigatorAutomationInformation {
  readonly attribute boolean webdriver;
};
Navigator includes NavigatorAutomationInformation;

NavigatorAutomationInformation 接口 不应在 WorkerNavigator 上暴露。

webdriver

如果webdriver-active 标志已设置,则返回 true,否则返回 false。

承认这与 Evil Bit [RFC3514] 是互补的。

5. 节点

WebDriver 协议由以下各方之间的通信组成:

本地端

本地端表示协议的客户端侧, 通常以特定于语言的库的形式存在, 这些库在 WebDriver 协议之上提供 API。 本规范不对这些库在有线协议层级之上的细节 设置任何限制。

远程端
远程端托管 协议的服务器侧。定义 远程端响应 WebDriver 协议的行为构成了 本规范的最大部分。

对于远程 端,该标准定义了两个宽泛的一致性 类,称为节点类型

中介节点
中介节点是充当代理的节点,同时实现 本地端远程端协议。但是,它们不被期望 直接实现远程端步骤。位于 特定中介节点端点节点之间的节点 被称为位于该端点节点上游
端点节点
端点节点是节点链中最终的远程端, 且不是中介节点。 端点节点由用户代理或类似程序实现。

本地端的角度来看, 所有远程端节点类型都必须与远程端在黑盒上不可区分, 因而在有线协议方面 受远程端要求的约束。

远程端就绪 状态指示 它是否可接受新连接。如果实现是端点节点,且活动 HTTP 会话列表不为空,则它必须为 false;或者如果已知该远程端处于 尝试创建新会话会 失败的状态,也必须为 false。在所有其他情况下,它必须为 true。

如果中介节点是一个管理多个端点节点的多路复用器,则这 可能表明其提供更多会话的能力,例如 当它已达到其最大容量时。

6. 协议

WebDriver 远程端必须提供 一个HTTP 合规的有线协议, 其中端点映射到不同的命令

由于本标准只定义远程端协议, 因此它不要求本地端应如何实现。 本地 端只被期望在能够使用远程端协议通信的范围内兼容; 对其暴露的面向用户的 API 不提出任何要求。

6.1 算法

本规范的各个部分以逐步算法的形式编写。 这些算法的细节不具有任何规范性意义; 实现可以自由采用任何实现策略, 只要其产生与规范等效的输出即可。 特别是,本文档中的算法针对 可读性而非性能进行了优化。

在返回值的算法可能失败的情况下, 它们被写成返回 成功错误成功 值具有关联的 data 字段, 其中封装了返回的值, 而错误值具有关联的错误码

当调用可能失败的算法时, 构造 “Let result be the result of trying to call algorithm” 等价于

  1. temp 为调用 algorithm 的结果。

  2. 如果 temp错误,则返回 temp; 否则令 resulttempdata 字段。

使用 nameobject 获取 属性的结果,定义为与在 object 上调用 Object.[[GetOwnProperty]](name) 的结果相同。

使用参数 namedefaultobject 获取带默认值的属性的结果, 定义为:如果在 object 上调用 Object.[[GetOwnProperty]](name) 得到的结果不是 undefined,则为该结果; 否则为 default

使用参数 namevalueobject设置属性, 定义为与在 object 上调用 Object.[[Put]](name, value) 相同。

对 JSON Object 类型的 object 进行 JSON 序列化的结果, 定义为调用 stringify(object) 的结果。

使用 text 进行 JSON 反序列化的结果定义为 调用 parse(text) 的结果。

6.2 命令

WebDriver 协议被组织为命令。 本规范中定义了方法和模板的每个 HTTP 请求 都表示一个单独的命令, 因此每个命令都会产生一个单独的HTTP 响应

响应一个命令时, 远程端将运行一系列操作, 称为远程端步骤。 这些步骤提供了远程端 在接收到特定命令时所采取的操作序列。

6.3 处理模型

远程端是一个 HTTP 服务器, 从客户端读取请求并写入响应, 通常通过 TCP 套接字进行。 为了本规范的目的,我们将特定本地端远程端之间的数据传输建模为一个 连接远程端可以向该连接写入字节读取字节。 但是,该连接如何工作 以及如何建立的确切细节不在范围内。

连接建立后,远程端必须运行 以下步骤:

  1. while连接尚未 关闭时:

    1. 连接读取字节,直到可以从数据构造出一个 完整的HTTP 请求。 令 request 为一个根据 [RFC7230] 的要求, 从接收到的数据构造出的请求。 如果无法构造完整的HTTP 请求, 则远程端必须关闭该连接, 或返回状态码为 500 的 HTTP 响应,或返回 一个错误,其错误 码unknown error

    2. request match 为以 requestmethodURL 作为参数, 运行匹配请求算法的结果。

    3. 如果 request match 的类型为错误, 则使用 request match错误码 发送错误, 并continue

      否则,令 commandURL variablesrequest match 的数据。

    4. session 为 null。

    5. 如果 URL variables contains "session id":

      此条件旨在排除 新建 会话状态 命令,以及任何不 操作特定 会话扩展命令

      1. session idURL variables["session id"]。

      2. 对于活动会话列表中的每个 active session

        1. 如果 active session会话 ID等于 session id,则令 sessionactive session,并跳出循环。

      3. 如果 sessionnull, 则使用错误码 invalid session id 发送错误, 然后continue

    6. 将一个任务加入远程端请求 队列,以运行以下 步骤:

      1. 如果 会话不再位于活动 会话列表中,则发送错误,其错误代码无效会话 ID,并返回。
      2. parametersnull

      3. 如果 requestmethod 是 POST:

        1. parse result 为以 requestbody 作为参数, 解析为 JSON的结果。如果此过程 抛出异常, 则返回一个错误,其错误码invalid argument,并跳回整个算法中的步骤 1。

        2. 如果 parse result 不是Object, 则使用错误码 invalid argument 发送错误 并跳回整个算法中的步骤 1。

          否则,令 parametersparse result

      4. navigate result 为以 session 调用 等待 导航完成的结果。

      5. 如果 navigate result错误, 则使用等于 navigate result错误 码错误码 发送错误 并返回。

      6. response result 为使用 sessionURL variablesparameterscommand 运行远程端 步骤 所获得的返回值。

      7. 如果 response result错误, 则使用等于 response result错误码错误码 发送错误 并返回。

      8. 断言:response result成功

      9. response dataresponse result 的 data。

      10. 以状态 200 和 response data 发送响应

当被要求使用 error code 和可选的 error data 字典 发送 错误时, 远程端必须运行以下步骤:

  1. statusnameerror code 对应的错误响应数据

  2. message 为实现定义的字符串, 其中包含对错误原因的人类可读描述。

  3. stacktrace 为实现定义的字符串, 其中包含错误发生时活动栈帧的栈跟踪报告。

    body 为一个新的 JSON Object, 并用以下属性初始化:

    "error"
    name
    "message"
    message
    "stacktrace"
    stacktrace
  4. 如果错误数据字典包含任何条目, 则将 body 上的 "data" 字段设置为 一个新的 JSON Object,并使用该字典填充。

  5. statusbody 作为参数发送响应

当被要求使用参数 statusdata 发送响应时, 远程端必须运行以下步骤:

  1. response 为一个新的响应

  2. responseHTTP 状态设置为 status, 并将状态消息设置为在状态码 注册表中对应于 status 描述的字符串。

  3. 使用以下值设置 response标头名称

    Content-Type
    "application/json; charset=utf-8"
    Cache-Control
    "no-cache"
  4. responsebody 为 一个 JSON ObjectUTF-8 编码后的JSON 序列化结果, 该 Object 带有一个键 "value",其值设置为 data

  5. response bytes 为根据 [RFC7230] 中的规则 序列化 response 所得到的字节序列。

  6. response bytes 写入连接

6.4 路由请求

请求路由 是从一个HTTP 请求 到实现该请求所表示的命令所需的一系列步骤的过程。

远程端具有关联的 URL 前缀, 它用作该远程端上 所有 WebDriver 定义的 URL 的前缀。 这必须是undefined路径绝对 URL

为了在给定 methodURL 的情况下 匹配 请求, 必须采取以下步骤:

  1. endpoints 为一个列表, 包含端点表中的每一行。

  2. endpoints 中移除每个条目,如果 URL 前缀与该条目的URI 模板的串联没有一个有效展开等于 URL路径

  3. 如果 endpoints 中没有条目, 则返回错误,其错误码unknown command

  4. 移除 endpointsmethod 列不等于 method 的每个条目。

  5. 如果 endpoints 中没有条目, 则返回错误,其错误码unknown method

  6. 现在 endpoints 中恰好有一个条目; 令 entry 为该条目。

  7. URI templateURL 前缀entryURI template 的串联。

  8. commandentry命令

  9. URL variables 为一个map, 对于 URI template 中定义的每个变量都有一个 entry, 其条目名称等于模板变量名称, 条目值为将 URI template 展开以匹配 URL路径所需的变量值。

  10. 返回成功,其数据为 commandURL variables

6.5 端点

以下端点表列出了 每个端点 节点命令methodURI 模板扩展命令会隐式 附加到该表。

方法 URI 模板 命令
POST /session 新建会话
DELETE /session/{session id} 删除会话
GET /status 状态
GET /session/{session id}/timeouts 获取超时
POST /session/{session id}/timeouts 设置超时
POST /session/{session id}/url 导航到
GET /session/{session id}/url 获取当前 URL
POST /session/{session id}/back 后退
POST /session/{session id}/forward 前进
POST /session/{session id}/refresh 刷新
GET /session/{session id}/title 获取标题
GET /session/{session id}/window 获取窗口句柄
DELETE /session/{session id}/window 关闭窗口
POST /session/{session id}/window 切换到窗口
GET /session/{session id}/window/handles 获取窗口句柄列表
POST /session/{session id}/window/new 新建窗口
POST /session/{session id}/frame 切换到框架
POST /session/{session id}/frame/parent 切换到父框架
GET /session/{session id}/window/rect 获取窗口矩形
POST /session/{session id}/window/rect 设置窗口矩形
POST /session/{session id}/window/maximize 最大化窗口
POST /session/{session id}/window/minimize 最小化窗口
POST /session/{session id}/window/fullscreen 全屏窗口
GET /session/{session id}/element/active 获取活动元素
GET /session/{session id}/element/{element id}/shadow 获取元素的 Shadow Root
POST /session/{session id}/element 查找元素
POST /session/{session id}/elements 查找元素列表
POST /session/{session id}/element/{element id}/element 从元素查找元素
POST /session/{session id}/element/{element id}/elements 从元素查找元素列表
POST /session/{session id}/shadow/{shadow id}/element 从 Shadow Root 查找元素
POST /session/{session id}/shadow/{shadow id}/elements 从 Shadow Root 查找元素列表
GET /session/{session id}/element/{element id}/selected 元素是否被选中
GET /session/{session id}/element/{element id}/attribute/{name} 获取元素属性
GET /session/{session id}/element/{element id}/property/{name} 获取元素属性值
GET /session/{session id}/element/{element id}/css/{property name} 获取元素 CSS 值
GET /session/{session id}/element/{element id}/text 获取元素文本
GET /session/{session id}/element/{element id}/name 获取元素标签名称
GET /session/{session id}/element/{element id}/rect 获取元素矩形
GET /session/{session id}/element/{element id}/enabled 元素是否启用
GET /session/{session id}/element/{element id}/computedrole 获取计算角色
GET /session/{session id}/element/{element id}/computedlabel 获取计算标签
POST /session/{session id}/element/{element id}/click 元素点击
POST /session/{session id}/element/{element id}/clear 元素清除
POST /session/{session id}/element/{element id}/value 元素发送按键
GET /session/{session id}/source 获取页面源码
POST /session/{session id}/execute/sync 执行脚本
POST /session/{session id}/execute/async 执行异步脚本
GET /session/{session id}/cookie 获取所有 Cookie
GET /session/{session id}/cookie/{name} 获取具名 Cookie
POST /session/{session id}/cookie 添加 Cookie
DELETE /session/{session id}/cookie/{name} 删除 Cookie
DELETE /session/{session id}/cookie 删除所有 Cookie
POST /session/{session id}/actions 执行操作
DELETE /session/{session id}/actions 释放操作
POST /session/{session id}/alert/dismiss 取消警告框
POST /session/{session id}/alert/accept 接受警告框
GET /session/{session id}/alert/text 获取警告框文本
POST /session/{session id}/alert/text 发送警告框文本
GET /session/{session id}/screenshot 截取屏幕截图
GET /session/{session id}/element/{element id}/screenshot 截取元素屏幕截图
POST /session/{session id}/print 打印页面

6.6 错误

错误在 WebDriver 协议中表示为一个HTTP 响应,其HTTP 状态在 4xx 或 5xx 范围内, 并且 JSON 主体包含该错误的详细信息。 该主体是一个 JSON Object, 并且有一个名为 "value" 的字段, 其值是一个带有三个字段、有时带有四个字段的对象:

下表列出了每个错误码、 其关联的HTTP 状态、 JSON error 代码, 以及错误的非规范性描述。 特定错误码错误 响应数据 是与该错误码对应行中的 HTTP StatusJSON Error Code 列的值。

错误码 HTTP 状态 JSON 错误码 描述
element click intercepted 400 element click intercepted Element Click 命令无法 完成, 因为接收事件的元素 正在遮挡被请求点击的元素。
element not interactable 400 element not interactable 命令无法完成, 因为该元素不是 指针键盘可交互的。
insecure certificate 400 insecure certificate 导航导致 用户代理遇到证书警告, 这通常是过期或无效 TLS 证书的结果。
invalid argument 400 invalid argument 传递给命令的参数 无效或格式错误。
invalid cookie domain 400 invalid cookie domain 尝试在与当前页面不同的域下 设置 cookie,这是非法操作。
invalid element state 400 invalid element state 命令无法完成,因为元素处于 无效状态,例如尝试 清除一个既不是 可编辑也不是可重置的元素。
invalid selector 400 invalid selector 参数是无效选择器。
invalid session id 404 invalid session id 在给定的会话 ID不在活动会话列表中时发生, 这意味着该会话要么不存在,要么不是 活动的。
javascript error 500 javascript error 执行用户提供的 JavaScript 时发生错误。
move target out of bounds 500 move target out of bounds 鼠标交互的目标不在浏览器视口中, 且无法被带入该视口。
no such alert 404 no such alert 在没有打开模态对话框时, 尝试对其进行操作。
no such cookie 404 no such cookie session当前浏览 上下文活动文档关联 cookie 中未找到与给定路径名称匹配的 cookie。
no such element 404 no such element 无法使用给定的搜索参数 在页面上定位元素。
no such frame 404 no such frame 切换到框架的命令 无法满足,因为无法找到该框架。
no such window 404 no such window 切换到窗口的命令 无法满足,因为无法找到该窗口。
no such shadow root 404 no such shadow root 该元素没有 shadow root。
script timeout error 500 script timeout 脚本未在其超时到期前完成。
session not created 500 session not created 无法创建新的会话
stale element reference 404 stale element reference 命令失败,因为 被引用的元素已不再附加到 DOM。
detached shadow root 404 detached shadow root 命令失败,因为 被引用的shadow root已不再附加到 DOM。
timeout 500 timeout 操作未在其超时到期前完成。
unable to set cookie 500 unable to set cookie 设置 cookie 值的命令无法满足。
unable to capture screen 500 unable to capture screen 无法进行屏幕捕获。
unexpected alert open 500 unexpected alert open 模态对话框处于打开状态,阻止了此操作。
unknown command 404 unknown command 命令无法执行, 因为远程端不知道该命令。
unknown error 500 unknown error 在处理命令时, 远程端 中发生未知错误。
unknown method 405 unknown method 请求的命令匹配了已知 URL, 但没有匹配该 URL 的任何方法。
unsupported operation 500 unsupported operation 表示一个本应正确执行的命令 由于某种原因无法被支持。

错误数据 字典 是字符串键到 JSON 可序列化值的映射, 可以可选地包含在错误对象中。

6.7 扩展

使用本节中定义的术语,其他人可以定义额外的 命令,以无缝集成到标准协议中。这允许 供应商公开其用户代理特有的功能,也 允许其他 Web 标准定义用于自动化新平台 特性的命令。

以这种方式定义的命令 称为扩展 命令, 且其行为与其他命令没有任何不同; 每个命令都有专用的 HTTP 端点和一组远程端步骤

每个扩展命令具有关联的 扩展命令 URI 模板, 它是一个URI 模板字符串, 并且应当与该命令所执行的操作有一定相似性。 该值 连同 HTTP 方法和扩展命令 一起被添加到端点表, 因而遵循与其他内建命令相同的 请求路由规则。

为了避免与其他实现发生潜在的资源冲突, 供应商特定的扩展 命令 URI 模板必须以一个或多个 能唯一标识供应商和 UA 的路径片段开始。 建议供应商使用其供应商前缀, 不添加额外字符,如 [CSS21] 中所概述的那样, 尤其是关于 供应商关键字的第 4.1.2.2 节, 将其作为该路径元素的名称, 并包含供应商选择的 UA 标识符。

其他规范可以定义额外的 WebDriver 能力。每个定义的 能力都必须有一个能力名称, 它是不包含 ":"(冒号)字符的字符串; 以及一个额外能力反序列化 算法,它是一组步骤,接受一个 具有 JSON 类型的参数 value,并返回 封装反序列化能力值的成功, 或错误

额外的 WebDriver 能力也可以 定义 匹配能力序列化算法, 它是一组步骤,用于确定某个能力是否由当前实现匹配, 并提供要返回给用户的任何计算值。 这组步骤接受一个参数 value, 该参数是对应额外 能力反序列化算法的输出, 并返回null 以表示该能力 未匹配,或者在该能力匹配时返回一个非 null 的 JSON 可序列化值。

其他规范也可以定义WebDriver 新会话算法,这些算法在创建新 会话之后、向远程端发送新会话响应之前被调用。 这些算法使用表示将要建立的 WebDriver 会话的 session, 以及将返回给远程端的能力对象 capabilities 进行调用。 允许此类算法修改能力对象中名称为 同一规范定义的额外 WebDriver 能力的任何条目。

远程端还可以引入 扩展能力, 它们是额外的能力, 用于提供配置或满足其他供应商特定需求。 扩展能力的键 必须包含 ":"(冒号)字符, 表示实现特定的命名空间。 该值可以是任意 JSON 类型。

扩展命令一样, 建议用于表示扩展能力命名空间的键 基于 [CSS21] 中列出的 供应商关键字, 并且位于字符串中第一个 ":" 字符之前。

7. 能力

WebDriver 能力 用于传达给定实现所支持的特性。 本地 端可以使用能力 来定义其在创建新会话时要求远程端 满足哪些特性。 同样,远程端使用能力 来描述一个会话的完整特性集。

以下标准能力表 枚举了每个实现必须支持的能力。 实现可以定义额外的扩展能力

能力 值类型 描述
浏览器名称 "browserName" string 标识用户代理。
浏览器版本 "browserVersion" string 标识用户代理的版本。
平台名称 "platformName" string 标识端点节点的操作系统。
接受不安全的 TLS 证书 "acceptInsecureCerts" boolean 指示在导航时,在会话持续期间, 是否隐式信任不受信任的和自签名的 TLS 证书。
页面 加载策略 "pageLoadStrategy" string 定义会话页面加载 策略
代理配置 "proxy" JSON 对象 定义会话代理 配置
窗口尺寸调整/定位 "setWindowRect" boolean 指示远程端是否支持所有调整窗口大小和重新定位命令
会话超时 "timeouts" JSON 对象 描述对某些会话操作施加的超时
严格文件可交互性 "strictFileInteractability" boolean 定义会话严格文件可交互性
未处理提示行为 "unhandledPromptBehavior" string 描述会话用户提示 处理器。 默认为 "dismiss and notify"。
User Agent "userAgent" string 标识端点节点默认 User-Agent 值

7.1 代理

代理 配置能力 是嵌套在主要能力中的 JSON Object。 实现可以定义额外的代理配置选项, 但不得改变下列选项的语义。

值类型 描述 有效值
proxyType string 指示代理配置的类型。 "pac", "direct", "autodetect", "system", 或 "manual"。
proxyAutoconfigUrl string 如果 proxyType 等于 "pac", 则定义代理 自动配置文件的 URL。 任意URL
httpProxy string proxyType 为 "manual" 时, 定义 HTTP 流量的代理主机 scheme 为 "http" 的主机和可选端口
noProxy array 列出当 proxyType 为 "manual" 时 应绕过代理的地址。 包含任意数量 StringList
sslProxy string proxyType 为 "manual" 时, 定义加密 TLS 流量的代理主机 scheme 为 "https" 的主机和可选端口
socksProxy string proxyType 为 "manual" 时, 定义 SOCKS 代理的代理主机 scheme 为undefined主机和可选端口
socksVersion number proxyType 为 "manual" 时, 定义 SOCKS 代理版本。 0 到 255(含)之间的任意整数

用于 scheme主机和 可选端口 定义为有效的主机,可选地后跟一个冒号 和有效的端口。该主机可以 包含凭据。如果 省略端口且 scheme 具有默认端口, 则该端口为隐含端口。否则,端口保持未定义。

proxyType 为 "direct" 表示 浏览器完全不应使用代理。

proxyType 为 "system" 表示 浏览器应使用底层操作系统配置的各种代理。

proxyType 为 "autodetect" 表示应以实现特定的方式检测要使用的代理。

远程端将参数 parameter 反序列化为代理的步骤为:

  1. 如果 parameter 不是 JSON Object,则返回 一个错误,其错误码invalid argument

  2. proxy 为一个新的空 代理配置对象

  3. 对于 parameter 中的每个可枚举自身属性, 运行以下子步骤:

    1. key 为属性的名称。

    2. value 为从 parameter 获取 名为 name 的属性的结果。

    3. 如果代理配置表中 没有与 key 匹配的 key, 则返回一个错误, 其错误码invalid argument

    4. 如果 value 不是该 key有效值之一,则返回 一个错误,其错误 码invalid argument

    5. proxy 上将属性 key 设置value

  4. 如果 proxy 没有 "proxyType" 的自身属性, 则返回一个错误,其错误 码invalid argument

  5. 如果从 proxy 获取 名为 "proxyType" 的属性的结果等于 "pac",且 proxy 没有 "proxyAutoconfigUrl" 的自身属性, 则返回 一个错误,其错误码invalid argument

  6. 如果 proxy 具有 "socksProxy" 的自身属性, 但没有 "socksVersion" 的自身属性, 则返回一个错误,其错误 码invalid argument

  7. 返回成功,其数据为 proxy

代理 配置对象是一个 JSON Object,其中每个匹配 代理配置中键的自身属性 都满足该键的有效性标准。

7.2 处理能力

给定 parameters会话 配置标志 flags,为了处理 能力端点节点 必须采取以下步骤:

  1. capabilities request 为从 parameters 获取 属性 "capabilities" 的结果。

    1. 如果 capabilities request 不是 JSON Object, 则返回错误,其错误 码invalid argument

  2. required capabilities 为从 capabilities request 获取 属性 "alwaysMatch" 的结果。

    1. 如果 required capabilitiesundefined, 则将该值设为一个空 JSON Object

    2. required capabilities 为使用 required capabilitiesflag 作为参数, trying验证能力的结果。

  3. all first match capabilities 为从 capabilities request 获取 属性 "firstMatch" 的结果。

    1. 如果 all first match capabilitiesundefined, 则将该值设为一个List,其中单个条目为空 JSON Object

    2. 如果 all first match capabilities 不是一个包含 一个或多个条目的List,则返回错误, 其错误码invalid argument

  4. validated first match capabilities 为空 List

  5. 对于 all first match capabilities 中 与索引属性对应的每个 first match capabilities

    1. validated capabilities 为使用 first match capabilitiesflags 作为参数, trying验证能力的结果。

    2. validated capabilities 追加到 validated first match capabilities

  6. merged capabilities 为空 List

  7. 对于 validated first match capabilities 中 与索引属性对应的每个 first match capabilities

    1. merged 为以 required capabilitiesfirst match capabilities 作为参数, trying合并 能力的结果。

    2. merged 追加到 merged capabilities

  8. 对于 merged capabilities 中 与索引属性对应的每个 capabilities

    1. matched capabilities 为以 capabilities 作为 参数, trying匹配 能力的结果。

    2. 如果 matched capabilities 不是null, 则返回成功,其数据为 matched capabilities

  9. 返回成功,其数据为null

当被要求使用参数 capabilities 验证能力时:

  1. 如果 capabilities 不是 JSON Object,则返回 一个错误,其错误码invalid argument

  2. result 为空 JSON Object

  3. 对于 capabilities 中的每个可枚举自身属性, 运行以下子步骤:

    1. name 为属性的名称。

    2. value 为从 capabilities 获取 名为 name 的属性的结果。

    3. 运行第一个匹配条件的子步骤:

      valuenull

      deserialized 被设置为null

      name 等于 "acceptInsecureCerts"

      如果 value 不是boolean,则返回 一个错误,其错误码invalid argument。否则,令 deserialized 被设置为 value

      name 等于 "browserName"
      name 等于 "browserVersion"
      name 等于 "platformName"

      如果 value 不是string,则返回 一个错误,其错误码invalid argument。否则,令 deserialized 被设置为 value

      name 等于 "pageLoadStrategy"

      deserialized 为以 value 作为参数, trying反序列化为页面 加载策略的结果。

      name 等于 "proxy"

      deserialized 为以 value 作为参数, trying反序列化 为代理的结果。

      name 等于 "strictFileInteractability"

      如果 value 不是boolean,则返回 一个错误,其错误码invalid argument。否则,令 deserialized 被设置为 value

      name 等于 "timeouts"

      deserialized 为使用 valuetrying反序列化为 超时配置 的结果。

      name 等于 "unhandledPromptBehavior"

      deserialized 为以 value 作为参数, trying反序列化 为未处理提示行为的结果。

      name 是某个额外 WebDriver 能力的名称

      deserialized 为以 value 作为参数, trying 去运行与 name 对应的扩展能力的额外 能力反序列化 算法的结果。

      name 是某个扩展能力的键

      如果实现已知 name, 则令 deserialized 为以实现特定方式 trying 去反序列化 value 的结果。 否则,令 deserialized 被设置为 value

      远程端端点节点

      返回一个错误,其错误码invalid argument

    4. 如果 deserialized 不是null, 则在 result 上以名称 name 和值 deserialized 设置属性

  4. 返回成功,其数据为 result

当使用 JSON Object 参数 primarysecondary 合并 能力时, 端点节点必须采取以下步骤:

  1. result 为一个新的 JSON Object

  2. 对于 primary 中的每个可枚举自身属性, 运行以下子步骤:

    1. name 为属性的名称。

    2. value 为从 primary 获取 名为 name 的属性的结果。

    3. result 上以名称 name 和值 value 设置属性
  3. 如果 secondaryundefined, 则返回 result

  4. 对于 secondary 中的每个可枚举自身属性, 运行以下子步骤:

    1. name 为属性的名称。

    2. value 为从 secondary 获取 名为 name 的属性的结果。

    3. primary value 为从 primary 获取属性 name 的结果。

    4. 如果 primary value 不是undefined, 则返回一个错误,其错误 码invalid argument

    5. result 上以名称 name 和值 value 设置属性
  5. 返回 result

给定 JSON Object capabilities会话 配置标志 flags,当匹配能力时,端点节点 必须采取以下步骤:

  1. matched capabilities 为一个 JSON Object, 具有以下条目:

    "browserName"
    用户代理名称的 ASCII 小写形式,作为 string
    "browserVersion"
    用户代理版本,作为string
    "platformName"
    当前平台名称的 ASCII 小写形式,作为 string
    "acceptInsecureCerts"
    Boolean,初始设置为 false, 表示会话不会在导航时 隐式信任不受信任的或自签名的 TLS 证书。
    "strictFileInteractability"
    Boolean,初始设置为 false, 表示会对 <input type=file> 应用可交互性检查。
    "setWindowRect"
    Boolean,指示远程端是否支持所有 调整大小和 定位命令
    "userAgent"
    包含默认 User-Agent 值的 String。
  2. 如果 flags 包含 "http",则将 以下条目添加到 matched capabilities

    "strictFileInteractability"
    Boolean,初始设置为 false, 表示会对 <input type=file> 应用可交互性检查。
  3. 可选地将扩展能力作为条目 添加到 matched capabilities。这些值可以被 省略,并且不要求添加所有 扩展能力

  4. 对于与 capabilities自身属性对应的 每个 namevalue

    1. match value 等于 value

    2. 运行第一个匹配 name 的子步骤:

      "browserName"

      如果 value 不是等于 matched capabilities 中 "browserName" 条目的 string, 则返回成功, 其数据为null

      有可能远程端需要 启动浏览器进程以正确确定 browserName。在执行此操作之前, 首选轻量级检查。

      "browserVersion"

      使用实现定义的比较算法,将 valuematched capabilities 中的 "browserVersion" 条目 进行比较。 该比较应接受使用 "<"、"<="、">" 和 ">=" 运算符对版本施加约束的 value

      如果两个值不匹配, 则返回成功,其数据为null

      版本比较作为实现细节保留, 因为每个用户代理可能都有冲突的方法 来编码用户代理版本, 而标准化这些方案超出了本标准的范围。

      有可能远程端需要 启动浏览器进程以正确确定 browserVersion。在执行此操作之前, 首选轻量级检查。

      "platformName"

      如果 value 不是等于 matched capabilities 中 "platformName" 条目的 string, 则返回成功,其数据为null

      以下平台名称在通常使用中具有 明确理解的语义,并且在为平台名称匹配 能力时, 将它们作为知名操作系统的有效同义词予以认可, 可以实现最大的互操作性:

      系统
      "linux" 任何基于 Linux 内核的服务器或桌面系统。
      "mac" Apple 的 macOS 的任何版本。
      "windows" Microsoft Windows 的任何版本,包括桌面版和 移动版。

      此列表并不详尽。

      New Session返回能力时, 返回更具体的 platformName 是有效的, 以允许用户正确识别 WebDriver 实现正在运行的操作系统。

      "acceptInsecureCerts"

      如果accept insecure TLS 标志已设置 且不等于 value, 则返回成功, 其数据为null

      如果端点节点 不支持不安全的 TLS 证书,并且这是最终无法匹配的原因, 则向本地端 提供此信息是有用的。

      "proxy"

      如果has proxy configuration 标志已设置,或者 value 中定义的代理配置未通过端点节点的 实现特定有效性检查,则返回成功, 其数据为null

      本地端只有在期望该能力被认可并使用已配置代理时, 才会发送此能力。其意图是,如果无法做到这一点, 则不会建立新会话。

      "unhandledPromptBehavior"

      如果使用 value 调用 check user prompt handler matches 为 false,则返回成功, 其数据为null

      否则
    3. 如果 match value 不是 null,则在 matched capabilities 上以名称 name 和 值 match value 设置属性

  5. 返回成功,其数据为 matched capabilities

8. 会话

WebDriver 会话 表示本地端与一个 特定远程端之间的 逻辑连接。会话对象保存 特定于该连接的状态。

中介节点将为每个活动会话维护一个关联 会话。这是 中介节点执行新建 会话命令时,在上游邻居上创建的会话。 关闭中介节点上的一个会话,也会关闭 关联会话的会话。

会话有一个会话 ID,它是用于唯一标识该 会话的UUID的字符串 表示。这是在创建会话时设置的。

会话有一个布尔值HTTP 标志,它在 会话创建时设置。设置了此标志的会话是 一个HTTP 会话

远程 端有关联的 活动会话列表, 这是当前已启动的所有会话的 列表。

远程 端有关联的 活动 HTTP 会话列表,这是当前已启动的所有HTTP 会话的列表。

端点 节点而言仅限单个 HTTP 会话,这意味着活动 HTTP 会话列表中的第一个条目将是唯一的条目。

HTTP 会话有关联的当前浏览 上下文,它是命令将针对其运行的浏览上下文, 有关联的当前 父 浏览上下文,它在更改浏览上下文时被设置为当前 浏览上下文的父级,以及 关联的当前顶级浏览上下文,它在 更改浏览上下文时被设置为当前浏览 上下文的顶级浏览上下文祖先。

HTTP 会话有关联的会话 超时,它是一个超时配置。它 初始设置为一个新的超时配置

HTTP 会话有关联的页面加载 策略,它是页面加载 策略表中的关键字之一。它初始设置为normal

HTTP 会话有关联的严格文件 可交互性状态,它是一个布尔值。它初始设置 为 false。

会话有关联的浏览上下文输入 状态映射,它是一个以顶级浏览 上下文为键、以输入状态对象为值的弱映射。它 初始设置为空映射。

HTTP 会话有关联的请求队列,它是由当前 等待 处理的请求组成的 队列

创建会话时,会提供一集合会话配置 标志,用于定义会话的特性。此 规范始终创建在会话配置标志中带有 "http" 的会话,这对应于HTTP 标志。外部规范可以定义额外的 标志,或创建不带HTTP 标志的会话。

8.1 全局状态

除了每会话状态之外,作为端点节点远程端还具有跨所有会话全局的附加状态。

端点节点有关联的接受不安全 TLS标志,该标志指示是否将不受信任或自签名的 TLS 证书视为受信任。如果端点不支持接受不安全的 TLS 连接,则该标志的默认值为 false;否则为未设置。

端点节点有关联的已有代理 配置标志,该标志指示代理是否已经 配置。如果端点 不支持代理配置,则该标志的默认值为 true;否则为 false。

要在给定 JSON Object capabilites会话配置 标志 flags创建 会话

  1. session id生成 UUID的结果。

  2. session 为一个新的会话,其会话 IDsession id,且HTTP 标志flags 包含 "http"。

  3. proxy 为从 capabilities 获取属性 "proxy" 的结果,并运行第一个匹配语句的 子步骤:

    proxy 是一个代理配置 对象

    执行实现定义的步骤,使用提取的 proxy 配置设置用户代理代理。如果定义的代理无法配置,则返回错误,其 错误代码session not created。否则 将已有代理配置标志设置为 true。

    否则
    设置 capabilities 的一个属性,其 名称为 "proxy",值为一个新的 JSON Object
  4. 如果 capabilites 有一个名为 "acceptInsecureCerts" 的属性,则将端点 节点接受不安全 TLS标志设置为从 capabilities 获取名为 "acceptInsecureCerts" 的属性的结果。

  5. user prompt handler capability 为从 capabilities 获取属性 "unhandledPromptBehavior" 的结果。

  6. 如果 user prompt handler capability 不是 undefined,则使用 user prompt handler capability 更新用户 提示处理器

  7. serialized user prompt handler序列化用户提示处理器的结果。

  8. capabilities 上设置一个属性,其名称为 "unhandledPromptBehavior",值为 serialized user prompt handler

  9. 如果 flags contains "http":

    1. strategy 为从 capabilities 获取属性 "pageLoadStrategy" 的结果。

      如果 strategy 是 string,则将会话页面加载 策略设置为 strategy。否则,将 页面加载策略设置为 normal, 并设置 capabilities 的一个属性,其名称为 "pageLoadStrategy",值为 "normal"。

    2. strictFileInteractability 为从 capabilities 获取属性 "strictFileInteractability" 的结果。如果 strictFileInteractability 是 boolean,则将会话严格文件 可交互性设置为 strictFileInteractability

    3. timeouts 为从 capabilities 获取属性 "timeouts" 的结果。 如果 timeouts 不是 undefined,则将 session会话超时 设置为 timeouts

    4. capabilities 上设置一个属性,其名称为 "timeouts",值为使用 session会话超时序列化超时 配置的结果。

  10. 以实现定义的方式处理 capabilities 中的任何扩展能力

  11. 使用参数 sessioncapabilitiesflags,运行外部规范中定义的任何WebDriver 新建会话算法

  12. session 追加到活动会话

  13. 如果 flags 包含 "http", 则将 session 追加到活动 HTTP 会话

  14. webdriver-active 标志设置为 true。

要在给定 session关闭 会话远程端必须执行以下步骤:

  1. 如果设置了 sessionHTTP 标志, 则从活动 HTTP 会话中移除 session

  2. 活动会话中移除 session

  3. 根据远程端的 类型执行以下子步骤:

    远程端是一个端点 节点
    1. 如果活动会话列表 为空:

      1. webdriver-active 标志 设置为 false

      2. 用户 提示处理器设置为 null。

      3. 取消设置接受 不安全 TLS标志。

      4. 已有 代理配置标志重置为其 默认值。

      5. 可选地,关闭所有顶级 浏览上下文, 且不提示卸载

    远程端是一个中介节点
    1. 关闭关联会话。如果这导致 错误发生,则先完成此算法的其余部分, 然后返回该错误

  4. 执行任何实现特定的清理步骤。

  5. 如果上述任何步骤中发生了错误, 则返回该错误,否则返回成功,其 数据为null

关闭会话可能导致关联的浏览器进程被 终止。 假设任何实现特定的清理步骤都在响应已发回客户端 之后执行, 这样连接就不会过早关闭。

8.2 新建会话

HTTP 方法 URI 模板
POST /session

新建会话命令 会使用端点节点创建一个新的 WebDriver 会话。 如果创建失败,则返回session not created 错误

如果远程端中介 节点, 它可以使用能力处理 算法的结果, 将新会话请求路由到适当的端点节点中介节点可以自由定义扩展能力 来协助此过程;但是,这些特定能力 不得转发给端点节点

如果中介节点需要与用户代理特性无关的额外信息, 建议将此信息作为顶层参数传递, 而不是作为请求的能力的一部分传递。 中介节点必须将自定义的 顶层参数(即非能力)转发给后续远程端节点。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果实现是端点节点,且 活动 HTTP 会话列表非空,或者 在其他情况下实现无法启动额外会话, 则返回错误,其错误码session not created

  2. 如果远程端是一个中介 节点,则执行 实现定义的步骤,其结果要么是返回一个错误,其错误代码session not created, 要么是返回一个成功,其数据同构于 远程端根据本 算法其余部分返回的数据。如果未返回错误,则该中介 节点必须保留对在上游节点上创建的会话的引用,将其作为关联 会话,以便 在后续命令中可以将命令转发给此关联会话

    如何完成这一点完全取决于实现, 但通常需要跟踪 sessionId,以及 上游远程端URLURL 前缀

  3. flags 为包含 "http" 的 set。

  4. capabilities 为以 parametersflags trying处理能力的结果。

  5. 如果 capabilitiesnull, 则返回错误,其错误码session not created

  6. session 为使用 capabilitiesflags 创建 会话的结果。

  7. body 为用以下内容初始化的 JSON Object

    "sessionId"
    session会话 ID
    "capabilities"
    capabilities
  8. session当前顶级 浏览 上下文设置为端点节点顶级 浏览上下文之一,优先选择具有系统 焦点顶级浏览 上下文, 或者否则优先选择任何其 可见性 状态visible顶级浏览 上下文

    WebDriver 实现通常会启动一个 全新的浏览器实例,但本规范中没有要求 必须这样做(也没有要求 WebDriver 只能用于自动化 Web 浏览器)。实现可以选择使用已有的 浏览器实例,例如通过选择当前具有 焦点的窗口。

  9. 请求队列设置为新的queue

  10. 返回成功,其数据为 body

8.3 删除会话

HTTP 方法 URI 模板
DELETE /session/{session id}

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session活动 HTTP 会话, 则try 使用 session 关闭会话

  2. 返回成功,其数据为null

8.4 状态

HTTP 方法 URI 模板
GET /status

实现可以可选地将 额外元信息作为主体的一部分包含进来, 但顶层属性 readymessage 是保留的,不得被覆盖。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. body 为一个新的 JSON Object, 具有以下属性:

    "ready"

    远程端就绪状态

    "message"

    一个实现定义的字符串, 解释远程端就绪状态

  2. 返回成功,其数据为 body

9. 超时

计时器是一个 struct。它有一个 超时触发标志,它是一个 boolean,初始为 false。

给定 timertimeout,为了启动 计时器

  1. 断言:timeout 不为 null。

  2. 并行运行以下步骤:

    1. 等待至少 timeout 毫秒经过。

    2. timer超时触发标志设置为 true。

超时 配置是一个 struct,表示 脚本求值导航元素 检索的超时。它有一个脚本 超时,它是整数或 null,且 初始设置为 30,000;一个页面加载 超时,它是整数或 null,且 初始设置为 300,000;以及一个隐式 等待超时,它是整数或 null,且 初始设置为 0。 给定 timeouts,为了反序列化为超时配置

  1. timeouts 设置为使用 timeouts 将 JSON 派生的 JavaScript 值转换为 Infra 值的结果。

  2. configuration 为一个新的超时 配置

  3. 对于 timeouts 中的每个 keyvalue

    1. 如果 «"script", "pageLoad", "implicit"» 不包含 key, 则继续。

    2. 如果 value 既不是 null,也不是大于或 等于 0 且小于或等于最大 安全 整数的 number,则返回错误,其错误码invalid argument

    3. 运行与 key 匹配的子步骤:

      "script"

      configuration脚本超时设置为 value

      "pageLoad"

      configuration页面加载超时设置为 value

      "implicit"

      configuration隐式等待超时设置为 value

  4. 返回成功,其数据为 configuration

给定 timeouts,为了序列化超时配置
  1. serialized 为空map

  2. serialized["script"] 设置为 timeouts脚本超时

  3. serialized["pageLoad"] 设置为 timeouts页面加载超时

  4. serialized["implicit"] 设置为 timeouts隐式等待超时

  5. 返回使用 serialized 将 Infra 值转换为 JSON 兼容的 JavaScript 值的结果。

9.1 获取超时

HTTP 方法 URI 模板
GET /session/{session id}/timeouts

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. timeouts 为使用会话超时 配置序列化超时 配置的结果

  2. 返回数据为 timeouts成功

9.2 设置超时

HTTP 方法 URI 模板
POST /session/{session id}/timeouts

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. timeouts 为使用 parameters trying反序列化为超时 配置的结果。

  2. session超时配置 设置为 timeouts

  3. 返回成功,其数据为null

11. 上下文

许多 WebDriver 命令发生在 session当前浏览上下文当前 顶级浏览上下文的上下文中。 session当前顶级浏览 上下文在 协议中由其关联的窗口句柄表示。 当使用 切换到窗口命令选择一个顶级浏览上下文时,可以使用切换到框架命令选择特定的浏览 上下文

使用术语“window”来 指代顶级浏览上下文 是历史遗留用法,既不对应 操作系统中“窗口”的概念, 也不对应 DOM Window 对象。

如果一个浏览上下文navigable 已被销毁, 则称该浏览上下文不再打开

每个浏览上下文都有一个关联的 窗口句柄,它唯一 标识该浏览上下文。这必须是一个 String,并且不得是 "current"。

web 框架 是一种抽象,用于在通过协议、 在远程端与本地端之间传输时, 标识 frameiframe

web frame 标识符 是字符串常量 "frame-075b-4da1-b6ba-e579c2d3230a"。

如果 ECMAScript Object 具有一个web frame 标识符自身属性, 则该对象表示 web 框架

web 窗口 是一种抽象,用于在通过协议、 在远程端与本地端之间传输时, 标识窗口

web window 标识符 是字符串常量 "window-fcc6-11e5-b4f8-330a88ab9d7f"。

如果 ECMAScript Object 具有一个web window 标识符自身属性, 则该对象表示 web 窗口

带有 WindowProxy 对象 windowWindowProxy 引用对象 由以下方式给出:

  1. 如果 window 的关联浏览上下文顶级浏览上下文, 则令 identifierweb window 标识符

    否则令其为web frame 标识符

  2. 返回一个使用以下属性初始化的 JSON Object

    identifier

    window浏览上下文的关联窗口句柄

为了通过一个 JSON Object object反序列化 web 框架,该 object 表示 web 框架

  1. 如果 object 没有自身属性web frame 标识符, 则返回错误,其错误码invalid argument

  2. reference 为从 object 获取 web frame 标识符属性的结果。

  3. 如果 reference 不是 String, 则返回一个错误,其错误码invalid argument

  4. browsing context窗口句柄reference浏览上下文;如果不存在这样的 浏览上下文,则为 null。

  5. 如果 browsing context 为 null,或是顶级浏览上下文, 则返回错误,其错误码no such frame

  6. 返回成功,其数据为 browsing context 的关联 窗口。

为了通过一个 JSON Object object反序列化 web 窗口,该 object 表示 web 窗口

  1. 如果 object 没有自身属性web window 标识符, 则返回错误,其错误码invalid argument

  2. reference 为从 object 获取 web window 标识符属性的结果。

  3. 如果 reference 不是 String, 则返回一个错误,其错误码invalid argument

  4. browsing context窗口句柄reference浏览上下文;如果不存在这样的 浏览上下文,则为 null。

  5. 如果 browsing context 为 null,或者不是顶级浏览上下文, 则返回错误,其错误码no such window

  6. 返回成功,其数据为 browsing context 的关联 窗口。

当要求给定 sessioncontext 设置当前浏览上下文时,实现必须 遵循以下步骤:

  1. session当前浏览 上下文设置为 context

  2. session当前父浏览 上下文设置为 context父浏览上下文, 如果该上下文存在;否则设置为null

当要求给定 sessioncontext 设置当前顶级浏览 上下文时,实现必须:

  1. 断言:context顶级浏览上下文

  2. session当前顶级 浏览 上下文设置为 context

  3. 使用 sessioncontext 设置当前浏览上下文

根据 [HTML] 规范的 焦点 小节, 命令不受操作系统窗口是否具有焦点的影响。

11.1 获取窗口句柄

HTTP 方法 URI 模板
GET /session/{session id}/window

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前 顶级浏览 上下文不再打开,则返回错误, 其错误码no such window

  2. 返回成功,其数据为与 session当前顶级浏览 上下文关联的窗口句柄

11.2 关闭窗口

HTTP 方法 URI 模板
DELETE /session/{session id}/window

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前 顶级浏览 上下文不再打开,则返回错误, 其错误码no such window

  2. Try 使用 session 处理任何用户提示

  3. 关闭 session当前 顶级 浏览上下文

  4. 如果不再有打开的顶级浏览上下文, 则try关闭会话

  5. 返回为 获取窗口句柄列表命令 运行远程端步骤的结果, 参数为 sessionURL variablesparameters

11.3 切换到窗口

HTTP 方法 URI 模板
POST /session/{session id}/window

切换窗口会选择 session当前顶级 浏览上下文,将其用作所有 后续命令的目标。在标签页式浏览器中,这通常会 使包含该浏览上下文的标签页成为选中的 标签页。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. handle 为从 parameters 获取属性 "handle" 的结果。

  2. 如果 handleundefined, 则返回错误,其错误码invalid argument

  3. 如果存在活动的用户提示,它会阻止 聚焦另一个顶级浏览上下文, 则返回错误,其错误码unexpected alert open

  4. 如果 handle 等于某个顶级浏览上下文的关联窗口 句柄, 则令 context 为该浏览上下文,并使用 sessioncontext 设置 当前顶级浏览上下文

    否则,返回错误,其错误码no such window

  5. 更新任何由用户选择 session当前浏览上下文进行 交互而产生的实现特定状态,且不改变 OS 级焦点。

  6. 返回成功,其数据为null

11.4 获取窗口句柄列表

HTTP 方法 URI 模板
GET /session/{session id}/window/handles

窗口句柄返回的顺序是任意的。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. handles 为一个 List

  2. 对于远程端中的每个顶级浏览上下文, 将关联的窗口句柄推入 handles

  3. 返回成功,其数据为 handles

11.5 新建窗口

HTTP 方法 URI 模板
POST /session/{session id}/window/new

创建新的顶级浏览上下文

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果实现不支持创建新的顶级 浏览上下文,则返回错误,其错误码unsupported operation

  2. 如果 session当前 顶级浏览 上下文不再打开,则返回错误, 其错误码no such window

  3. Try 使用 session 处理任何用户提示

  4. type hint 为从 parameters 获取属性 "type" 的结果。

  5. 通过运行 window open steps 创建新的顶级浏览上下文, 其中 URL 设置为 "about:blank",target 设置为空 字符串,features 设置为 "noopener",并且 用户代理被配置为创建新的浏览上下文。这必须 在不为所创建的浏览 上下文调用聚焦步骤的情况下完成。 如果 type hint 的值为 "tab", 且实现支持在同一个 OS 窗口中存在多个浏览上下文, 则新的浏览上下文应与 session当前浏览 上下文共享一个 OS 窗口。如果 type hint 为 "window",且实现支持在不同 OS 窗口中存在多个 浏览上下文,则所创建的浏览 上下文应位于新的 OS 窗口中。在所有其他情况下, 浏览上下文如何呈现给用户的细节都是 实现定义的。

  6. handle 为 新创建窗口的关联窗口句柄

  7. 如果新创建的窗口与 session当前浏览 上下文共享 OS 级窗口,则令 type 为 "tab"; 否则为 "window"。

  8. result 为一个新的 JSON Object,使用以下内容初始化:

    "handle"
    handle 的值。
    "type"
    type 的值。
  9. 返回成功,其数据为 result

11.6 切换到框架

HTTP 方法 URI 模板
POST /session/{session id}/frame

切换到框架命令用于选择 session当前顶级 浏览上下文,或 session当前 浏览上下文子浏览上下文, 将其用作 session 后续命令当前 浏览上下文。 给定 sessionURL variablesparameters 时,远程端步骤为:

  1. id 为从 parameters 获取属性 "id" 的结果。

  2. 如果 id 不是nullNumber 对象, 或表示 web 元素Object, 则返回错误,其错误码invalid argument

  3. 运行第一个匹配条件的子步骤:

    idnull
    1. 如果 session当前顶级 浏览 上下文不再打开, 则返回错误, 其错误码no such window

    2. Try 使用 session 处理任何用户提示

    3. 使用 sessionsession当前 顶级浏览上下文 设置 当前浏览上下文

    idNumber 对象
    1. 如果 id 小于 0 或大于 216 – 1, 则返回错误,其错误码invalid argument

    2. 如果 session当前浏览上下文 不再 打开,则返回错误,其错误码no such window

    3. Try 使用 session 处理任何用户提示

    4. windowsession当前浏览上下文活动文档关联 窗口

    5. 如果 id 不是 window支持的 属性索引, 则返回错误,其错误码no such frame

    6. child window 为通过调用 window.[[GetOwnProperty]] (id) 获得的WindowProxy 对象。

    7. 使用 sessionchild window浏览上下文 设置 当前浏览上下文

    id 表示 web 元素
    1. 如果 session当前浏览上下文 不再 打开,则返回错误,其错误码no such window

    2. Try 使用 session 处理任何用户提示

    3. element 为 使用 sessionid trying获取已知元素 的结果。

    4. 如果 element 不是 frameiframe 元素, 则返回错误,其错误码no such frame

    5. 使用 sessionelement内容 navigable活动 浏览上下文 设置 当前浏览上下文

  4. 更新任何由用户选择 session当前浏览上下文进行 交互而产生的实现特定状态,且不改变 OS 级焦点。

  5. 返回成功,其数据为null

WebDriver 不受同源策略约束, 因此始终可以切换到子浏览上下文, 即使它们与当前浏览上下文不同源。

11.7 切换到父框架

HTTP 方法 URI 模板
POST /session/{session id}/frame/parent

切换到父框架命令session 未来命令当前浏览上下文 设置为 session当前浏览上下文的父级。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文已经是 顶级浏览上下文

    1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

    2. 返回成功,其数据为null

  2. 如果 session当前父 浏览上下文 不再打开,则返回错误,其错误 码no such window

  3. Try 使用 session 处理任何用户提示

  4. 如果会话当前父浏览上下文不是 null,则使用 session当前父 浏览上下文设置当前浏览上下文

  5. 更新任何由用户选择 session当前浏览上下文进行 交互而产生的实现特定状态,且不改变 OS 级焦点。

  6. 返回成功,其数据为null

11.8 调整窗口大小和定位 窗口

WebDriver 提供命令, 用于与包含 session当前顶级 浏览上下文的操作系统窗口交互。 由于不同操作系统的窗口管理器提供不同的能力, 并非本节中的所有命令都能被所有远程端支持。 对这些命令的支持由窗口 尺寸调整/定位能力决定。 当某个命令不受支持时, 会返回unsupported operation 错误

顶级浏览上下文 具有关联的窗口状态, 用于描述其 OS 小部件窗口处于何种可见性状态。 它可以处于以下状态之一:

状态 关键字 默认 描述
最大化窗口状态 "maximized" 窗口已最大化。
最小化窗口状态 "minimized" 窗口已图标化。
普通窗口状态 "normal" 窗口正常显示。
全屏窗口状态 "fullscreen" 窗口处于全屏模式。

如果出于任何原因,顶级浏览上下文的 OS 窗口无法进入任一窗口状态,或者此 概念不适用于当前系统,则默认状态 必须为 normal

对于 WindowProxy windowWindowRect 对象是使用以下属性初始化的Object

"x"

windowscreenX 属性。

"y"

windowscreenY 属性。

"width"

windowsouterWidth 属性。

"height"

windowouterHeight 属性。

给定一个具有关联顶级浏览上下文的操作系统级窗口, 为了最大化 窗口, 运行实现特定步骤, 将该操作系统级窗口转换到最大化窗口状态。 如果窗口管理器支持调整窗口大小, 但没有窗口最大化概念, 则窗口尺寸必须增加到 窗口管理器允许的当前屏幕的 最大可用大小。 当窗口完成转换时返回, 或在实现定义的超时时间内返回。

给定一个具有关联顶级浏览上下文的操作系统级窗口, 为了图标化 窗口, 运行实现特定步骤, 将该操作系统级窗口转换到最小化窗口状态。 在顶级浏览上下文活动文档可见性状态 达到hidden 状态之前, 或操作超时之前,不要从此操作返回。

给定一个具有关联顶级浏览上下文的操作系统级窗口, 为了恢复 窗口, 运行实现特定步骤, 将窗口恢复或取消隐藏到 可见屏幕。 在顶级浏览上下文活动文档可见性状态 达到visible 状态之前, 或操作超时之前,不要从此操作返回。

11.8.1 获取窗口矩形

HTTP 方法 URI 模板
GET /session/{session id}/window/rect

获取窗口矩形命令 返回与 session当前 顶级浏览上下文对应的操作系统窗口 在屏幕上的大小和位置。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前 顶级浏览上下文不再打开, 则返回错误,其错误码no such window

  2. Try 使用 session 处理任何用户提示

  3. 返回成功,其数据设置为 session当前顶级浏览 上下文WindowRect 对象

11.8.2 设置窗口矩形

HTTP 方法 URI 模板
POST /session/{session id}/window/rect

设置窗口矩形命令 会改变与 session当前顶级浏览 上下文对应的操作系统窗口的大小和位置。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. width 为从 parameters 获取名为 "width" 的属性的结果。

  2. 如果 widthundefined,则令 width 为 null。

  3. height 为从 parameters 获取名为 "height" 的属性的结果。

  4. 如果 heightundefined,则令 height 为 null。

  5. x 为从 parameters 获取 名为 "x" 的属性的结果。

  6. 如果 xundefined,则令 x 为 null。

  7. y 为从 parameters 获取 名为 "y" 的属性的结果。

  8. 如果 yundefined,则令 y 为 null。

  9. 如果 widthheight 既不是 null,也不是 0 到 231 − 1 范围内的 Number,则返回错误, 其错误码invalid argument

  10. 如果 xy 既不是 null,也不是 −(231) 到 231 − 1 范围内的 Number, 则返回错误,其错误码invalid argument

  11. 如果远程端出于任何原因不支持 针对 session当前 顶级浏览上下文设置窗口矩形命令, 则返回错误,其错误 码unsupported operation

    设置窗口矩形命令 受到部分支持的情况下(即支持某些参数组合, 但不支持其他组合),预期实现会继续 执行剩余步骤。

  12. 如果 session当前 顶级浏览 上下文不再打开,则返回错误, 其错误码no such window

  13. Try 使用 session 处理任何用户提示

  14. 完全退出全屏

  15. 恢复窗口

  16. window 为包含 session当前 顶级浏览上下文的操作系统窗口

  17. 如果实现能够设置 window 的尺寸:

    1. 如果 width 不为 null,则将 window 的宽度 (以 CSS 像素为单位),包括 任何浏览器 chrome和外部绘制的窗口 装饰, 设置为尽可能接近 width 的值。

    2. 如果 height 不为 null,则将 window 的高度 (以 CSS 像素为单位),包括 任何浏览器 chrome和外部绘制的窗口 装饰, 设置为尽可能接近 height 的值。

  18. 如果实现能够设置 window 的位置:

    1. 如果 x 不为 null,则将 window 左边缘的 x 坐标设置为 尽可能接近 x 的值。

    2. 如果 y 不为 null,则将 window 顶部 边缘的 y 坐标设置为尽可能接近 y 的值。

  19. 返回成功,其数据设置为 session当前顶级浏览 上下文WindowRect 对象

11.8.3 最大化窗口

HTTP 方法 URI 模板
POST /session/{session id}/window/maximize

最大化窗口命令会在包含 session当前顶级浏览 上下文的窗口上调用窗口管理器特定的“最大化”操作(如果有)。 这通常会将窗口增大到最大 可用大小,而不会进入全屏。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果远程端出于任何原因不支持针对 session当前顶级 浏览上下文最大化 窗口命令,则返回错误, 其错误码unsupported operation

  2. 如果 session当前 顶级浏览 上下文不再打开,则返回错误, 其错误码no such window

  3. Try 使用 session 处理任何用户提示

  4. 完全退出全屏

  5. 恢复窗口

  6. 最大化窗口, 该窗口为 session当前顶级浏览 上下文的窗口。

  7. 返回成功,其数据设置为 session当前顶级浏览 上下文WindowRect 对象

11.8.4 最小化窗口

HTTP 方法 URI 模板
POST /session/{session id}/window/minimize

最小化窗口命令会在包含 session当前顶级浏览 上下文的窗口上调用窗口管理器特定的“最小化”操作(如果有)。 这通常会在系统托盘中隐藏窗口。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果远程端出于任何原因不支持针对 session当前顶级 浏览上下文最小化 窗口命令,则返回错误, 其错误码unsupported operation

  2. 如果 session当前 顶级浏览 上下文不再打开,则返回错误, 其错误码no such window

  3. Try 使用 session 处理任何用户提示

  4. 完全退出全屏

  5. 图标化窗口

  6. 返回成功,其数据设置为 session当前顶级浏览 上下文WindowRect 对象

11.8.5 全屏窗口

HTTP 方法 URI 模板
POST /session/{session id}/window/fullscreen

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果远程端支持全屏, 则返回错误,其错误码unsupported operation

  2. 如果 session当前 顶级浏览 上下文不再打开,则返回错误, 其错误码no such window

  3. Try 使用 session 处理任何用户提示

  4. 恢复窗口

  5. session当前顶级浏览 上下文活动文档文档元素调用 fullscreen an element

    窗口现在处于全屏窗口状态

  6. 返回成功,其数据设置为 session当前顶级浏览 上下文WindowRect 对象

12. 元素

web 元素 是一种抽象,用于在通过协议、 在远程端与本地端之间传输时, 标识一个元素

web element 标识符是字符串常量 "element-6066-11e4-a52e-4f735466cecf"。

如果 ECMAScript Object 具有一个web element 标识符自身属性, 则该对象表示 web 元素

WebDriver 节点 ID是一个全局唯一字符串, 表示特定 WebDriver 会话中 DOM 节点的句柄。

弱映射是一个映射,其中键被弱 持有,即如果键对象被垃圾回收,则移除相应项,并且 映射中的存在不会阻止垃圾回收。这可作为 直接在键对象上定义属性的替代方式。

与 ECMAScript WeakMap 不同, 弱 映射可以参与 Map 可用的完整操作集。

WebDriver 会话有一个浏览上下文组节点 映射,它是浏览上下文 组节点 ID 映射之间的弱映射

节点 ID 映射是节点和其 对应 WebDriver 节点 ID之间的弱映射

WebDriver 会话有一个可导航对象已见节点映射, 它是可导航对象和集合之间的弱 映射

要在给定 sessionbrowsing contextreference获取节点

  1. browsing context group node mapsession浏览上下文组节点 映射
  2. browsing context groupbrowsing context浏览上下文组
  3. 如果 browsing context group node map 不 包含 browsing context group,则返回 null。
  4. node id mapbrowsing context group node map[browsing context group]。
  5. nodenode id map 中其 值为 reference 的项;如果存在这样的项,则为该项,否则为 null。
  6. 返回 node

为了给定 sessionbrowsing contextnode获取 或创建节点引用

  1. browsing context group node mapsession浏览上下文组节点 映射
  2. browsing context groupbrowsing context浏览上下文组
  3. 如果 browsing context group node map 不 包含 browsing context group,则将 browsing context group node map[browsing context group] 设置为一个新的weak map
  4. node id mapbrowsing context group node map[browsing context group]。
  5. 如果 node id map 不包含 node
    1. node id 为一个新的全局唯一字符串。
    2. node id map[node] 设置为 node id
    3. navigablebrowsing context活动文档node navigable
    4. navigable seen nodes mapsessionnavigable seen nodes map
    5. 如果 navigable seen nodes map 不 包含 navigable,则将 navigable seen nodes map[navigable] 设置为空集合。
    6. node id 追加到 navigable seen nodes map[navigable]。
  6. 返回 node id map[node]。

给定 sessionbrowsing contextreference 时,如果以下步骤返回 true,则节点 引用是已知的

  1. navigablebrowsing context活动文档node navigable
  2. navigable seen nodes mapsessionnavigable seen nodes map
  3. 如果 navigable seen nodes map 包含 navigable,并且 navigable seen nodes map[navigable] 包含 reference, 则返回 true,否则返回 false。

为了给定 sessionreference获取已知 元素

  1. 如果在 sessionsession当前浏览上下文reference节点引用是已知的不成立,则返回 错误,其 错误 码no such element
  2. node 为使用 sessionsession当前浏览 上下文reference 获取节点的结果。
  3. 如果 node 不为 null,且 node 未实现 Element,则返回错误,其错误 码no such element
  4. 如果 node 为 null,或 node 已过时,则返回 错误,其 错误 码stale element reference
  5. 返回成功,其数据为 node

为了给定 sessionelement获取或创建 web 元素引用

  1. 断言:element 实现了 Element
  2. 返回 使用给定的 sessionsession当前 浏览上下文element trying获取或 创建节点 引用的结果。

sessionelementweb 元素引用对象是:

  1. identifierweb element 标识符

  2. reference 为使用 sessionelement 获取或创建 web 元素引用的结果。

  3. 返回一个 JSON Object,该对象以一个属性初始化, 其名称为 identifier,值为 reference

为了通过一个 JSON Object object反序列化 web 元素,该 object 表示 web 元素

  1. 如果 object 没有自身属性web element 标识符, 则返回错误,其错误码invalid argument

  2. reference 为从 object 获取web element 标识符属性的结果。

  3. 如果 reference 不是 String, 则返回一个错误,其错误码invalid argument

  4. element 为使用 sessionreference trying获取已知元素 的结果。

  5. 返回成功,其数据为 element

一个 元素 是失效的, 如果其 节点文档不是活动文档, 或者它未连接

为了将一个元素滚动到视图中, 仅当该元素尚未在视图中时, 执行以下步骤:

  1. options 为 以下 ScrollIntoViewOptions

    "behavior"
    "instant"
    逻辑滚动位置 "block"
    "end"
    逻辑滚动位置 "inline"
    "nearest"
  2. element 作为 this 值运行 Function.[[Call]](scrollIntoView, options)。

可编辑元素 是可用于键入清除的元素, 它们分为两个子类别:

可变表单控件元素

表示 input 元素, 它们是可变的(例如不是只读禁用的),并且其 type 属性 处于以下状态之一:

以及 textarea 元素。

可变元素

表示作为编辑宿主content editable的元素。

如果一个元素的 "pointer-events" 样式属性的 解析值 是 "none",则称该元素具有 pointer events disabled

如果一个元素input 元素, 并且其 readonly 属性已设置,则该元素被视为只读

12.1 可交互性

为了确定一个元素 是否可以使用指针操作与之交互, WebDriver 会执行命中测试以找出 该交互是否能够到达所请求的元素。

可交互元素 是一个元素,它要么是 指针可交互,要么是键盘可交互

指针可交互元素 定义为在其矩形中位于视口内部的中心点处, 按绘制顺序找到的第一个元素, 不包括任何已渲染滚动条的尺寸。

键盘可交互元素 是任何具有可聚焦区域元素, 或者是 body 元素, 或者是文档元素

元素视图内中心 点 是以下矩形的原点位置: 该矩形是元素第一个由 getClientRects() 返回的DOMRect初始视口之间的交集。 它可以按如下方式计算:

  1. rectangle 为 在element 上调用 getClientRects() 返回的 DOMRect 集合中的第一个对象。

  2. leftmax(0, min(x 坐标, x 坐标 + 宽度 维度))。

  3. rightmin(innerWidth, max(x 坐标, x 坐标 + 宽度 维度))。

  4. topmax(0, min(y 坐标, y 坐标 + 高度 维度))。

  5. bottommin(innerHeight, max(y 坐标, y 坐标 + 高度 维度))。

  6. xfloor((left + right) ÷ 2.0)。

  7. yfloor((top + bottom) ÷ 2.0)。

  8. 返回 (x, y) 对。

如果以下步骤返回 true,则元素 element禁用的

  1. 如果 elementoption 元素,或 elementoptgroup 元素:

    1. 对于 element 的每个包含祖先 ancestor

      1. 如果 ancestoroptgroup 元素,或 ancestorselect 元素,并且 ancestor 实际禁用,则返回 true。

    2. 返回 false。

  2. 返回 element 实际禁用

如果一个元素是其自身指针可交互绘制 树的成员, 并假定其指针事件未被 禁用, 则该元素在视图中

如果一个元素在其中心点处的 指针可交互绘制树 为空, 或者此树中的第一个元素 不是其自身的包含后代,则该元素被遮挡

元素 element指针可交互绘制树 按以下方式生成:

  1. 如果 elementsession当前浏览 上下文活动文档不在同一树中, 则返回一个空序列。

  2. rectangles 为 在 element 上调用 getClientRects() 所返回的 DOMRect 序列。

  3. 如果 rectangles 的长度为 0, 则返回一个空序列。

  4. center pointelement视口内中心点

  5. 给定坐标 center point,返回点处的元素

12.2 Shadow Root

shadow root 是一种抽象,用于在通过协议、 在远程端与本地端之间传输时, 标识一个shadow root

shadow root 标识符是字符串常量 "shadow-6066-11e4-a52e-4f735466cecf"。

如果 ECMAScript Object 具有一个shadow root 标识符自身属性, 则该对象表示 shadow root

为了给定 sessionreference获取 已知 shadow root

  1. 如果在 sessionsession当前浏览上下文reference节点引用是已知的不成立,则返回 错误, 其错误码no such shadow root
  2. node 为使用 sessionsession当前浏览 上下文reference 获取节点的结果。
  3. 如果 node 不为 null,且 node 未实现 ShadowRoot,则返回错误, 其错误码no such shadow root
  4. 如果 node 为 null,或 node 已分离,则返回 错误, 其错误码detached shadow root
  5. 返回成功,其数据为 node

为了给定 sessionshadow root获取或创建 shadow root 引用

  1. 断言:element 实现了 ShadowRoot
  2. 返回 使用 sessionsession当前 浏览上下文element trying获取 或创建节点 引用的结果。

sessionshadow rootshadow root 引用对象由以下给出:

  1. identifiershadow root 标识符

  2. reference 为使用 sessionshadow root 获取或创建 shadow root 引用的结果。

  3. 返回一个 JSON Object,该对象以一个属性初始化, 其名称为 identifier,值为 reference

当要求通过一个 JSON Object object反序列化 shadow root, 该 object 表示 shadow root

  1. 如果 object 没有自身属性shadow root 标识符, 则返回错误,其错误码invalid argument

  2. reference 为从 object 获取 shadow root 标识符属性 的结果。

  3. 如果 reference 不是 String, 则返回一个错误,其错误码invalid argument

  4. shadow 为 使用 sessionreference trying获取 已知 shadow root 的结果。

  5. 返回成功,其数据为 shadow

如果一个shadow root节点文档不是活动文档, 或者称为其宿主的元素节点 已 过时,则该 shadow root 已分离

12.3 检索

查找元素查找元素列表从元素查找元素从元素查找元素列表从 Shadow Root 查找元素, 以及从 Shadow Root 查找元素列表命令 允许查找单个元素和元素集合。 元素检索搜索会使用文档节点的 先序遍历来执行, 匹配所提供选择器的表达式。

当要求给定 sessionstart nodeusingvalue查找时,远程 端必须运行以下步骤:

  1. location strategy 等于 using

  2. selector 等于 value

  3. timeoutsession会话超时隐式等待超时

  4. timer 为一个新的计时器

  5. 如果 timeout 不为 null:

    1. 使用 timertimeout 启动计时器

  6. elements returned 为空List

  7. elements returned 为空 且 timertimeout fired flag未 设置时:

    1. elements returned 设置为使用参数 start nodeselector trying 调用 相关元素定位策略的结果。

    2. 如果在执行元素定位策略期间出现 DOMExceptionSyntaxErrorXPathException,或其他错误, 则返回错误 invalid selector
  8. result 为空List

  9. 对于 elements returned 中的每个 element, 将 sessionelementweb 元素引用对象 追加到 result

  10. 返回成功,其数据为 result

12.3.1 定位器策略

元素定位策略是 一个枚举属性,决定应使用何种技术 在 session当前 浏览上下文中搜索元素。以下定位 策略表列出了为此属性定义的关键字和状态:

状态 关键字
CSS 选择器 "css selector"
链接文本选择器 "link text"
部分链接文本选择器 "partial link text"
标签名称 "tag name"
XPath 选择器 "xpath"
12.3.1.1 CSS 选择器

为了使用 CSS 选择器策略 查找web 元素, 需要完成以下步骤:

  1. elements 为以 start node 作为thisselector 作为参数调用 querySelectorAll() 的结果。如果这导致抛出异常,则返回错误,其错误 码invalid selector

  2. 返回成功,其数据为 elements

12.3.1.4 标签名称

为了使用 标签名称 策略查找web 元素,返回成功,其数据设置为以 start node 作为thisselector 作为参数调用 getElementsByTagName() 的结果。

12.3.1.5 XPath

为了使用 XPath 选择器策略 查找web 元素, 需要完成以下步骤:

  1. evaluateResult 为使用参数 selectorstart nodenullORDERED_NODE_SNAPSHOT_TYPEnull 调用 evaluate 的结果。

    使用快照是为了提升操作的原子性。

  2. index 为 0。

  3. length 为从 evaluateResult 获取 属性 "snapshotLength" 的结果。如果这抛出 XPathException,则返回错误,其 错误 码invalid selector;否则,如果这抛出任何其他 异常,则返回错误,其错误 码unknown error

  4. result 为空NodeList

  5. index 小于 length 时,重复:

    1. node 为以 evaluateResult 作为thisindex 作为参数调用 snapshotItem 的结果。
    2. 如果 node 不是元素,则返回一个错误, 其错误码invalid selector

    3. node 追加到 result
    4. index 增加 1。
  6. 返回成功,其数据为 result

12.3.2 查找元素

HTTP 方法 URI 模板
POST /session/{session id}/element

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. location strategy 为从 parameters 获取 名为 "using" 的 属性的结果。

  2. 如果 location strategy 不是 定位策略表中的关键字,则返回 错误, 其错误码invalid argument

  3. selector 为从 parameters 获取 名为 "value" 的 属性的结果。

  4. 如果 selectorundefined, 则返回错误,其错误码invalid argument

  5. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  6. Try 使用 session 处理任何用户提示

  7. start nodesession当前浏览 上下文文档元素

  8. 如果 start nodenull, 则返回错误,其错误码no such element

  9. result 为使用 sessionstart nodelocation strategyselector trying查找的结果。

  10. 如果 result 为空,则返回错误, 其错误码no such element。否则,返回 result 的第一个元素。

12.3.3 查找元素列表

HTTP 方法 URI 模板
POST /session/{session id}/elements

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. location strategy 为从 parameters 获取 名为 "using" 的 属性的结果。

  2. 如果 location strategy 不是 定位策略表中的关键字,则返回 错误, 其错误码invalid argument

  3. selector 为从 parameters 获取 名为 "value" 的 属性的结果。

  4. 如果 selectorundefined, 则返回错误,其错误码invalid argument

  5. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  6. Try 使用 session 处理任何用户提示

  7. start nodesession当前浏览 上下文文档 元素

  8. 如果 start nodenull, 则返回错误,其错误码no such element

  9. 返回使用 sessionstart nodelocation strategyselector trying查找的结果。

12.3.4 从元素查找元素

HTTP 方法 URI 模板
POST /session/{session id}/element/{element id}/element

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. location strategy 为从 parameters 获取 名为 "using" 的 属性的结果。

  2. 如果 location strategy 不是 定位策略表中的关键字,则返回 错误, 其错误码invalid argument

  3. selector 为从 parameters 获取 名为 "value" 的 属性的结果。

  4. 如果 selectorundefined, 则返回错误,其错误码invalid argument

  5. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  6. Try 使用 session 处理任何用户提示

  7. start node 为使用 sessionURL variables["element id"] trying获取 已知元素的结果。

  8. result 为使用 sessionstart nodelocation strategyselector trying查找的值。
  9. 如果 result 为空,则返回错误, 其错误码no such element。否则,返回 result 的第一个元素。

12.3.5 从元素查找元素列表

HTTP 方法 URI 模板
POST /session/{session id}/element/{element id}/elements

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. location strategy 为从 parameters 获取 名为 "using" 的 属性的结果。

  2. 如果 location strategy 不是 定位策略表中的关键字,则返回 错误, 其错误码invalid argument

  3. selector 为从 parameters 获取 名为 "value" 的 属性的结果。

  4. 如果 selectorundefined, 则返回错误,其错误码invalid argument

  5. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  6. Try 使用 session 处理任何用户提示

  7. start node 为使用 sessionURL variables["element id"] trying获取 已知元素的结果。

  8. 返回使用 sessionstart nodelocation strategyselector trying查找的结果。

12.3.6 从 Shadow Root 查找元素

HTTP 方法 URI 模板
POST /session/{session id}/shadow/{shadow id}/element

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. location strategy获取名为 "using" 的属性的结果。

  2. 如果 location strategy 不是 定位策略表中的关键字,则返回 错误, 其错误码invalid argument

  3. selector获取名为 "value" 的属性的结果。

  4. 如果 selectorundefined, 则返回错误,其错误码invalid argument

  5. 如果 session当前浏览 上下文不再打开,则返回错误, 其错误码no such window

  6. 处理任何用户提示,如果其值为错误则返回该值。

  7. start node 为使用 sessionURL variables["shadow id"] trying获取已知 shadow root的结果。

  8. result 为使用 sessionstart nodelocation strategyselector trying查找的值。
  9. 如果 result 为空,则返回错误, 其错误码no such element。否则,返回 result 的第一个元素。

12.3.7 从 Shadow Root 查找元素列表

HTTP 方法 URI 模板
POST /session/{session id}/shadow/{shadow id}/elements

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. location strategy获取名为 "using" 的属性的结果。

  2. 如果 location strategy 不是 定位策略表中的关键字,则返回 错误, 其错误码invalid argument

  3. selector获取名为 "value" 的属性的结果。

  4. 如果 selectorundefined, 则返回错误,其错误码invalid argument

  5. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  6. 处理任何用户提示,如果其值为错误则返回该值。

  7. start node 为 使用 sessionURL variables["shadow id"] trying获取 已知 shadow root的结果。

  8. 返回使用 sessionstart nodelocation strategyselector trying查找的结果。

12.3.8 获取活动元素

HTTP 方法 URI 模板
GET /session/{session id}/element/active

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. active elementsession当前浏览 上下文文档元素活动元素

  4. 如果 active element 是非 null 的元素, 则返回成功,其数据设置为 sessionactive elementweb 元素引用 对象

    否则,返回错误,其错误码no such element

12.3.9 获取 元素 Shadow Root

HTTP 方法 URI 模板
GET /session/{session id}/element/{element id}/shadow

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  2. 处理任何用户提示,如果其值为错误则返回该值。

  3. element 为使用 sessionURL variables[element id] trying获取已知元素的结果。

  4. shadow rootelementshadow root

  5. 如果 shadow root 为 null,则返回错误, 其错误码no such shadow root

  6. serializedsessionshadow rootshadow root 引用对象

  7. 返回成功,其数据为 serialized

12.4 状态

为了给定 sessionelement计算绝对位置

  1. rect 为调用 getBoundingClientRect() 返回的值。

  2. windowsession当前 顶级浏览上下文关联窗口

  3. x 为 (windowscrollX + rectx 坐标)。

  4. y 为 (windowscrollY + recty 坐标)。

  5. 返回 (x, y) 对。

为了确定节点是否与另一个节点 other 不在同一树中, 运行以下子步骤:

  1. 如果该节点节点文档 不是 other节点文档, 则返回 true。

  2. 如果以 other 作为参数调用该节点compareDocumentPosition() 的结果是 DOCUMENT_POSITION_DISCONNECTED (1), 则返回 true,否则返回 false。

element容器是:

处于有效元素上下文中的 option 元素
处于有效元素上下文中的 optgroup 元素

element元素 上下文, 它由以下方式确定:

  1. datalist parent 为 从 element 反向遍历树时到达的第一个 datalist 元素; 如果到达树的根,则为undefined

  2. select parent 为 从 element 反向遍历树时到达的第一个 select 元素; 如果到达树的根,则为undefined

  3. 如果 datalist parentundefined, 则元素上下文select parent。 否则,元素上下文datalist parent

处于无效元素上下文中的 option 元素

该元素没有容器。

否则

容器是该元素本身。

12.4.1 元素是否被选中

HTTP 方法 URI 模板
GET /session/{session id}/element/{element id}/selected

元素是否被选中命令 确定被引用的元素是否已被选中。 此操作只对 CheckboxRadio Button 状态的 input 元素, 或 option 元素有意义。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. element 为使用 sessionURL variables[element id] trying获取已知元素的结果。

  4. selected 为与第一个匹配语句对应的值:

    elementinput 元素, 且具有一个处于 CheckboxRadio Button 状态的 type 属性

    elementcheckedness 的结果。

    elementoption 元素

    elementselectedness 的结果。

    否则
    False。
  5. 返回成功,其数据为 selected

12.4.2 获取 元素属性

HTTP 方法 URI 模板
GET /session/{session id}/element/{element id}/attribute/{name}

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. element 为使用 sessionURL variables 的 element id trying获取已知元素的结果。

  4. nameURL variables["name"]。

  5. result 为第一个匹配条件的结果:
    如果 name布尔属性

    如果 element 使用 name 调用 hasAttribute(), 则为 "true"(字符串), 否则为null

    否则

    按名称 name 获取属性 的结果。

  6. 返回成功,其数据为 result

请注意,此命令的行为 偏离了 [DOM] 中 getAttribute() 的行为, 后者在设置了布尔属性的情况下 会返回空字符串。 此命令之所以返回字符串形式的 true, 是因为这在大多数动态类型编程语言中会求值为 true, 但仍保留预期的类型信息。

12.4.3 获取 元素属性值

HTTP 方法 URI 模板
GET /session/{session id}/element/{element id}/property/{name}

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. element 为使用 sessionURL variables 的 element id trying获取已知元素的结果。

  4. name URL variables["name"]。

  5. property 为在 element 上调用 Object.[[GetProperty]](name) 的结果。

  6. resultproperty 的值(如果不是undefined),否则为null

  7. 返回成功,其数据为 result

12.4.4 获取 元素 CSS 值

HTTP 方法 URI 模板
GET /session/{session id}/element/{element id}/css/{property name}

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. element 为使用 URL variables["element id"] trying获取 已知元素的结果。

  4. computed value 为第一个匹配条件的结果:

    session当前浏览 上下文活动文档类型不是 "xml"
    来自 element 样式声明的参数 URL variables["property name"] 的计算值
    否则
    ""(空字符串)
  5. 返回成功,其数据为 computed value

12.4.5 获取元素文本

HTTP 方法 URI 模板
GET /session/{session id}/element/{element id}/text

处理文本时, 空白被 定义为 Unicode 字符数据库中具有 Unicode 字符属性 "WSpace=Y" 或 "WS" 的字符。 [UAX44]

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. element 为使用 sessionURL variables[element id] trying获取已知元素的结果。

  4. rendered text 为执行 实现特定步骤的结果,该结果与以 bot.dom.getVisibleText 作为 this 值, 对 Function.[[Call]](null, element) 的结果完全相同。

  5. 返回成功,其数据为 rendered text

12.4.6 获取 元素标签名称

HTTP 方法 URI 模板
GET /session/{session id}/element/{element id}/name

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. element 为使用 URL variables["element id"] trying获取 已知元素的结果。

  4. qualified name 为获取 elementtagName IDL 属性的结果。

  5. 返回成功,其数据为 qualified name

12.4.7 获取元素矩形

HTTP 方法 URI 模板
GET /session/{session id}/element/{element id}/rect

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. element 为使用 sessionURL variables["element id"] trying获取 已知元素的结果。

  4. coordinates 为使用 sessionelement 计算绝对 位置的结果。

  5. rectelement边界矩形

  6. body 为一个新的 JSON Object,用以下内容初始化:

    "x"
    coordinates 的第一个值。
    "y"
    coordinates 的第二个值。
    "width"
    rect宽度维度的值。
    "height"
    rect高度维度的值。
  7. 返回成功,其数据为 body

12.4.8 元素是否启用

HTTP 方法 URI 模板
GET /session/{session id}/element/{element id}/enabled

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. element 为使用 sessionURL variables[element id] trying获取已知元素的结果。

  4. 如果 session当前浏览 上下文活动文档类型不是 "xml",则令 enabled 为一个初始设置为 true 的布尔值。

    否则,令 enabled 为 false, 并跳转到此算法的最后一步。

  5. 如果表单控件禁用, 则将 enabled 设置为 false。

  6. 返回成功,其数据为 enabled

12.4.9 获取计算角色

HTTP 方法 URI 模板
GET /session/{session id}/element/{element id}/computedrole

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文不再打开, 则返回错误,其错误码no such window

  2. Try 使用 session 处理任何用户提示

  3. element 为使用 URL variables["element id"] trying获取 已知元素的结果。

  4. role 为计算 elementWAI-ARIA 角色的结果。

  5. 返回成功,其数据为 role

12.4.10 获取 计算标签

HTTP 方法 URI 模板
GET /session/{session id}/element/{element id}/computedlabel

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文不再打开, 则返回错误,其错误码no such window

  2. Try 使用 session 处理任何用户提示

  3. element 为使用 sessionURL variables["element id"] trying获取已知元素的结果。

  4. label 为对 element可访问名称执行 可访问 名称和描述计算的结果。

  5. 返回成功,其数据为 label

12.5 交互

元素交互命令 提供了一组用于操作表单控件的高级指令集。 不同于操作, 它们会隐式地将元素滚动到视图中, 并检查它是一个可交互元素

某些可重置元素定义了自己的清除 算法。 不同于其关联的重置算法, 作为这些算法的一部分对表单控件所做的更改 确实计为由用户导致的更改 (因此,例如确实会导致 input 事件触发)。 当为没有定义自己的清除算法的元素调用清除算法时, 必须改为调用其重置算法

input 元素的清除算法 是将脏值标志脏选中性 标志恢复为 false, 将元素的 设置为空字符串, 如果元素具有 checked 内容属性,则将元素的选中性设置为 true, 如果没有则设置为 false, 清空选定文件列表, 然后当且仅当 type 属性的当前状态定义了一个值清理算法时调用它。

textarea 元素的清除算法 是将脏值标志恢复为 false, 并将元素的原始值设置为空字符串。

output 元素的清除算法 是将元素的值模式标志设置为 default, 然后将元素的 textContent IDL 属性 设置为空字符串(从而清除元素的子节点)。

12.5.1 元素点击

HTTP 方法 URI 模板
POST /session/{session id}/element/{element id}/click

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. element 为使用 sessionelement id trying获取已知元素的结果。

  4. 如果 element 是处于文件上传状态input 元素, 则返回错误,其错误码invalid argument

  5. element容器滚动到视图中

  6. 如果 element容器仍不在视图中, 则返回错误,其错误码element not interactable

  7. 如果 element容器 被另一个元素遮挡, 则返回错误,其错误码element click intercepted

  8. element 进行匹配:

    option 元素
    1. parent nodeelement容器

    2. parent node触发一个 mouseOver 事件

    3. parent node触发一个 mouseMove 事件

    4. parent node触发一个 mouseDown 事件

    5. parent node 上运行聚焦 步骤

    6. 如果 element禁用

      1. parent node触发一个 input 事件。

      2. previous selectedness 等于 element选中性

      3. 如果 element容器 具有 multiple 属性, 则通过将 element选中性状态设置为其当前选中性的相反值来切换它。

        否则, 将 element选中性状态设置为 true。

      4. 如果 previous selectedness 为 false, 则在 parent node触发一个 change 事件。

    7. parent node触发一个 mouseUp 事件

    8. parent node触发一个 click 事件

    否则
    1. input state 为给定 sessionsession当前顶级 浏览 上下文获取输入状态的结果。

    2. actions options 为一个新的操作选项, 其中是元素 原点步骤设置为表示 web 元素,且获取元素原点步骤设置为获取 WebElement 原点

    3. input id生成 UUID的结果。

    4. source 为使用 input state 和 "pointer" 创建输入 源的结果。

    5. 使用 input stateinput idsource 添加输入源

    6. click pointelement视图内中心 点

    7. pointer move action 为一个使用参数 input id、 "pointer" 和 "pointerMove" 构造的操作 对象

    8. pointer move action设置属性 x0

    9. pointer move action设置属性 y0

    10. pointer move action设置属性 originelement

    11. pointer down action 为一个使用参数 input id、 "pointer" 和 "pointerDown" 构造的操作 对象

    12. pointer down action设置属性 button0

    13. pointer up action 为一个使用参数 input id、 "pointer" 和 "pointerUp" 构造的操作 对象

    14. pointer up action设置属性 button0

    15. actions 为列表 «pointer move action, pointer down action, pointer up action»。

    16. 使用 input stateactionssession当前 浏览上下文actions options 分派操作列表

    17. 使用 input stateinput id 移除输入源

  9. 等待,直到用户代理事件循环已转动足够次数以 处理上一步生成的 DOM 事件。

  10. 执行实现定义的步骤,以允许 点击触发的任何导航开始。

    并不总是清楚这会导致算法等待多久, 并且也承认某些实现可能存在不可避免的竞态条件。 其意图是允许新的导航尝试开始, 以便算法中的下一步是有意义的。 点击可能不会导致导航尝试, 在这种情况下,实现定义的步骤可以立即返回, 下一步也将立即返回。

  11. Try 使用 session 等待导航完成

  12. Try 运行导航后检查

  13. 返回成功,其数据为null

12.5.2 元素清除

HTTP 方法 URI 模板
POST /session/{session id}/element/{element id}/clear

清除 content editable 元素

  1. 如果 elementinnerHTML IDL 属性 是空字符串,则不执行任何操作并返回。

  2. element 运行聚焦步骤

  3. elementinnerHTML IDL 属性 设置为空字符串。

  4. element 运行取消聚焦步骤

清除可重置元素

  1. empty 为第一个匹配条件的结果:

    elementinput 元素, 且其 type 属性处于文件上传状态
    如果选定文件列表的长度为 0, 则为 True, 否则为 false。
    否则
    如果其 IDL 属性为空字符串, 则为 True, 否则为 false。
  2. 如果 element约束验证候选对象, 且它满足其约束, 并且 empty 为 true, 则中止这些子步骤。

  3. element 调用聚焦步骤

  4. element 调用清除算法

  5. element 调用取消聚焦步骤

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. element 为使用 sessionelement id trying获取 已知元素的结果。

  4. 如果 element可编辑, 则返回一个错误,其错误码invalid element state

  5. element 滚动到视图中

  6. timeoutsession会话超时隐式等待超时

  7. timer 为一个新的计时器

  8. 如果 timeout 不为 null:

    1. 使用 timertimeout 启动计时器

  9. 等待 element 变为可交互, 或 timertimeout fired flag 被设置, 以先发生者为准。

  10. 如果 element可交互, 则返回错误,其错误码element not interactable

  11. 运行第一个匹配语句的子步骤:

    element可变表单 控件元素

    调用清除 可重置元素的步骤。

    element可变元素

    调用清除 content editable 元素的步骤。

    否则

    返回错误,其错误 码invalid element state

  12. 返回成功,其数据为null

12.5.3 元素发送按键

HTTP 方法 URI 模板
POST /session/{session id}/element/{element id}/value

元素发送按键命令 将表单控件元素滚动到视图中, 然后将提供的按键发送给该元素。 如果该元素不是键盘可交互, 则返回 element not interactable 错误

不可键入表单控件input 元素, 其 type 属性状态 导致主要输入机制 不是通过虚拟或物理键盘来完成。

不可键入表单控件意在指 用户代理呈现为文本输入控件以外形式的 表单控件元素。 当目标是一个处于color 状态、 并呈现为色轮的 input 元素时, 将模拟与它的交互, 而不是使用带操作的按键仿真来键入。

不可键入表单 控件的其他示例包括 通过系统原生小部件交互的表单控件, 例如 select 元素的滚动选项列表, 以及非桌面设备上处于number 状态input 元素的数字键盘。

用于输入的按键输入源可以在“键入”过程中 通过发送null key来清除,该键为 U+E000 (NULL)。

为了在给定 input stateinput idsourceundo actionsbrowsing context清除修饰键状态

  1. 如果 source 不是按键输入源, 则返回错误,其错误码invalid argument

  2. actions options 为一个新的操作选项, 其中是元素原点步骤设置为表示 web 元素,且获取元素原点步骤 设置为 获取 WebElement 原点

  3. 对于 undo actions 中按词法排序的键中的每个 entry key

    1. actionundo actions 中 等于键 entry key 的值。

    2. 如果 action 不是类型为 "key" 且子类型为 "keyUp" 的操作对象, 则返回错误,其错误 码invalid argument

    3. actions 为列表 «action»

    4. 使用 input stateactionsbrowsing context操作选项 分派操作列表

如果一个扩展字素簇由单个 unicode 码点组成, 且code 不是undefined, 则它是可键入的

keyboardshifted 状态keyboardshift 属性的值。

为了在给定 input stateinput idsourcetextbrowsing context分派可键入字符串的事件

  1. actions options 为一个新的操作选项, 其中是元素原点步骤设置为表示 web 元素,且获取元素原点步骤 设置为 获取 WebElement 原点

  2. 对于 text 中的每个 char
    1. global key state 为使用 input state 获取 全局按键状态的结果。

    2. 如果 charshifted 字符, 且 sourceshifted 状态为 false:

      1. action 为一个使用 input id、"key" 和 "keyDown" 构造的操作对象, 并将其 value 属性设置为 U+E008 ("left shift")。

      2. actions 为列表 «action»。

      3. 使用 input stateactionsbrowsing context 分派操作列表

    3. 如果 char 不是shifted 字符, 且 sourceshifted 状态为 true:

      1. action 为一个使用 input id、"key" 和 "keyUp" 构造的操作对象, 并将其 value 属性设置为 U+E008 ("left shift")。

      2. tick actions 为列表 «action»。

      3. 使用 input stateactionsbrowsing contextactions options 分派操作列表

    4. keydown action 为一个 使用参数 input id、"key" 和 "keyDown" 构造的操作对象

    5. keydown actionvalue 属性设置为 char

    6. keyup actionkeydown action 的副本, 其 subtype 属性改为 "keyUp"。

    7. actions 为列表 «keydown action, keyup action»。

    8. 使用 input stateactionsbrowsing contextactions options 分派操作列表

当要求在给定 typecluster 以及 browsing context 的情况下分派 composition 事件时,远程端必须在 browsing context执行 实现特定的操作分派步骤,其等价于按照 [UI-EVENTS] 的要求发送 composition 事件, 并生成具有指定属性的以下事件。

为了在给定 input stateinput idsourcetextbrowsing contextactions options为字符串分派操作

  1. clusters 为通过text 分解为扩展字素簇创建的数组。

  2. undo actions 为空映射。

  3. current typeable text 为空列表。

  4. 对于 clusters 中与索引属性对应的每个 cluster, 运行第一个匹配语句的子步骤:

    clusternull key
    1. 使用 input stateinput idsourcecurrent typeable textbrowsing context 分派 可键入字符串的事件。 清空 current typeable text

    2. Try 使用 input stateinput idsourceundo actionsbrowsing context 清除修饰键 状态

    3. 清除 undo actions

    cluster修饰键
    1. 使用 input stateinput idsourcecurrent typeable textbrowsing context 分派 可键入字符串的事件

    2. 清空current typeable text

    3. keydown action 为一个 使用参数 input id、 "key" 和 "keyDown" 构造的操作对象

    4. keydown actionvalue 属性设置为 cluster

    5. actions 为列表 «keydown action»

    6. 使用 input stateactionsbrowsing contextactions options 分派操作 列表

    7. undo actions 添加一个条目, 其键为 cluster,其值为 keydown action 的副本,并将 subtype 属性修改为 "keyUp"。

    cluster可键入的

    cluster 追加到 current typeable text

    否则
    1. 使用 input stateinput idsourcecurrent typeable textbrowsing context 分派 可键入字符串的事件

    2. 清空 current typeable text

    3. 使用参数 "compositionstart"、undefinedbrowsing context 分派 composition event

    4. 使用参数 "compositionupdate"、clusterbrowsing context 分派 composition event

    5. 使用参数 "compositionend"、clusterbrowsing context 分派 composition event

  5. 使用 input stateinput idsourcecurrent typeable textbrowsing context 分派可键入字符串的 事件

  6. Try 使用 input stateinput idsourceundo actionsbrowsing context 清除修饰键状态

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. text 为从 parameters 获取名为属性 "text" 的结果。

  2. 如果 text 不是 String, 则返回一个错误,其错误码invalid argument

  3. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  4. Try 使用 session 处理任何用户提示

  5. element 为使用 sessionURL variables[element id] trying获取已知元素的结果。

  6. 如果 element 是处于文件上传状态input 元素,则令 file 为 true;否则为 false。

  7. 如果 file 为 false,或者会话严格文件可交互性为 true, 则运行以下子步骤:

    1. element 滚动到视图中

    2. timeoutsession会话超时隐式等待 超时

    3. timer 为一个新的计时器

    4. 如果 timeout 不为 null:

      1. 使用 timertimeout 启动计时器

    5. 等待 element 变为键盘可交互,或 timertimeout fired flag 被设置, 以先发生者为准。

    6. 如果 element 不是键盘可交互, 则返回错误,其错误 码element not interactable

    7. 如果 element 不是活动元素, 则为 element 运行聚焦步骤

  8. 运行第一个匹配条件的子步骤:

    file 为 true
    1. files 为按换行符(\n)拆分 text 的结果。

    2. 如果 files 的长度为 0, 则返回一个错误,其错误码invalid argument

    3. multiple 等于在 element 上 使用 "multiple" 调用 hasAttribute() 的结果。

    4. 如果 multiplefalse,且 files 的长度不等于 1, 则返回一个错误,其错误码invalid argument

    5. 验证用户给定的每个文件是否存在。 如果有任何文件不存在,则返回错误, 其错误码invalid argument

    6. 完成实现特定步骤, 其等价于在 input 元素上设置选定 文件。 如果 multipletrue, 则将 files 追加到 element选定文件中。

    7. element 上按顺序触发这些事件:

      1. input
      2. change
    8. 返回成功,其数据为null

    element不可键入表单控件
    1. 如果 element 没有名为 value自身属性, 则返回一个错误,其错误 码element not interactable

    2. 如果 element可变, 则返回一个错误,其错误码element not interactable

    3. element设置属性 valuetext

    4. 如果 element 遭受错误输入, 则返回一个错误,其错误码invalid argument

    5. 返回成功,其数据为null

    elementcontent editable
    如果 element 当前没有获得焦点, 则在任何子内容之后设置文本插入光标。
    否则
    1. 如果 element 当前没有获得焦点, 则令 current text lengthelementAPI 值长度

    2. 使用 current text length 作为 startend 参数, 通过设置选择范围 来设置文本插入光标。

  9. input state 为使用 sessionsession当前顶级浏览 上下文获取输入 状态的结果。

  10. input id生成 UUID的结果。

  11. source 为使用 input state 和 "key" 创建输入 源的结果。

  12. 使用 input stateinput idsource 添加输入源

  13. input stateinput idsourcetext 以及 session当前浏览 上下文作为参数, 为字符串分派操作

  14. 使用 input stateinput id 移除输入源

  15. 返回成功,其数据为null

13. 文档

13.1 获取页面源码

HTTP 方法 URI 模板
GET /session/{session id}/source

获取页面源码命令返回 session当前 浏览 上下文活动文档的 DOM 字符串 序列化结果。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. source 为在一个虚构节点上调用 片段序列化算法的结果,该虚构节点唯一的 子节点是文档元素,并为 require well-formed 标志提供 true。 如果这导致抛出异常,则令 sourcenull

  4. 如果 sourcenull, 则令 source 为将 session当前浏览 上下文活动文档 序列化为字符串的结果。

  5. 返回成功,其数据为 source

13.2 执行脚本

集合是一个实现 Iterable 接口的Object, 且其满足:

为了在给定 sessionvalue 和可选参数 seenJSON 反序列化远程端必须运行以下 步骤:

  1. 如果未提供 seen, 则令 seen 为空List

  2. 跳转到下面第一个适用的步骤:

  3. value 进行匹配:

    undefined
    null
    类型为 Boolean
    类型为 Number
    类型为 String

    返回成功,其数据为 value

    Object,其表示 web 元素

    返回 value反序列化web 元素

    Object,其表示 shadow root

    返回 value反序列化shadow root

    Object,其表示 web frame

    返回 value反序列化web frame

    Object,其表示 web window

    返回 value反序列化web window

    Array 的实例
    Object 的实例

    返回使用 sessionvalueseen, 并以 JSON 反序列化算法作为克隆 算法的克隆对象算法。

为了在给定 sessionvalueJSON 克隆, 返回使用 sessionvalue 和空List 内部 JSON 克隆的结果。

为了在给定 sessionvalueseen 时进行内部 JSON 克隆, 对 value 进行匹配, 返回第一个匹配语句的值:

undefined
null

返回成功,其数据为null

类型为 Boolean
类型为 Number
类型为 String

返回成功,其数据为 value

Element 的实例

如果 element 已过时, 则返回错误,其错误码stale element reference

否则:

  1. referencesessionvalueweb 元素引用对象

  2. 返回成功,其数据为 reference

ShadowRoot 的实例

如果 shadow root 已分离, 则返回错误,其错误码detached shadow root

否则:

  1. referencesessionvalueshadow root 引用对象

  2. 返回成功,其数据为 reference

一个 WindowProxy 对象

如果 valueWindowProxy 对象的关联浏览上下文 已被销毁, 则返回错误,其错误码stale element reference

否则:

  1. referencevalueWindowProxy 引用 对象

  2. 返回成功,其数据为 reference

具有一个名为 "toJSON"、且为 Function自身属性
返回成功,其数据为以 value 作为 this 值调用 Function.[[Call]](toJSON) 返回的值。
否则
  1. result 为使用 sessionvalueseen,并以内部 JSON 克隆 作为 clone algorithm克隆对象的结果。

  2. 返回成功,其数据为 result

为了给定 sessionvalueseenclone algorithm克隆对象

  1. 如果 valueseen 中, 则返回错误,其错误码javascript error

  2. value 追加到 seen

  3. result 为第一个匹配语句的值, 对 value 进行匹配:

    一个集合

    一个新的 Array, 其 length 属性等于从 value 获取属性 length 的结果。

    否则

    一个新的 Object

  4. 对于 value 中的每个可枚举属性, 运行以下子步骤:

    1. name 为该属性的名称。

    2. source property value 为从 value 获取名为 name 的属性的结果。 如果这样做导致脚本运行且该脚本抛出错误, 则返回错误,其错误 码javascript error

    3. cloned property result 为使用 sessionsource property valueseen 调用 clone algorithm 的结果。

    4. 如果 cloned property result成功, 则用名称 name 和等于 cloned property result 的数据的值, 设置 result 的属性。

    5. 否则,返回 cloned property result

  5. 移除 seen 的最后一个元素。

  6. 返回成功,其数据为 result

当要求用参数 parameters 从请求中提取脚本参数时, 实现必须:

  1. script 为从 parameters 获取名为 "script" 的属性的结果。

  2. 如果 script 不是 String, 则返回错误,其错误码invalid argument

  3. args 为从 parameters 获取名为 "args" 的属性的结果。

  4. 如果 args 不是 Array,则返回错误, 其错误码invalid argument

  5. arguments 为使用 sessionargs JSON 反序列化的结果。

  6. 返回成功,其数据为 scriptarguments

执行函数体的规则如下。 该算法返回一个 ECMAScript 完成记录

如果在算法执行期间的任何时刻出现用户提示, 则立即返回 Completion { [[Type]]: normal, [[Value]]: null, [[Target]]: empty },但继续并行运行此算法的其他步骤。

  1. windowsession当前浏览 上下文活动 文档关联窗口

  2. environment settingswindow相关设置对象

  3. global scopeenvironment settings realm全局环境
  4. 如果 body 不能解析为 FunctionBody, 或者解析检测到早期错误, 则返回 Completion { [[Type]]: normal, [[Value]]: null, [[Target]]: empty }。

  5. 如果 body 以一个包含 use strict 指令指令序言开头, 则令 strict 为 true, 否则令 strict 为 false。

  6. 使用 environment settings 准备运行脚本

  7. 使用 environment settings 准备运行回调

  8. function 为调用 FunctionCreate 的结果,其参数为:

    kind
    Normal。
    list
    一个空List
    body
    上面解析 body 的结果。
    global scope
    上面解析 global scope 的结果。
    strict
    上面解析 strict 的结果。
  9. completion 为以 function 作为 this 值, 调用 Function.[[Call]](window, parameters) 的结果。

  10. 使用 environment settings 运行回调后清理

  11. 使用 environment settings 运行脚本后清理

  12. 返回 completion

上述算法不与任何特定元素关联, 因此不受文档 CSP 指令约束。

13.2.1 执行脚本

HTTP 方法 URI 模板
POST /session/{session id}/execute/sync

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. bodyarguments 为使用参数 parameters trying从请求中提取脚本 参数的结果。

  2. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  3. Try 使用 session 处理任何用户提示

  4. timeoutsession会话超时脚本超时

  5. timer 为一个新的计时器

  6. 如果 timeout 不为 null:

    1. 使用 timertimeout 启动计时器

  7. promise一个新的 Promise

  8. 并行运行以下子步骤:

    1. scriptPromise 为带参数 bodyarguments promise 调用 执行函数体的结果。

    2. scriptPromise 以值 v 兑现时, 以值 v resolve promise

    3. scriptPromise 以值 r 拒绝时, 以值 r reject promise

  9. 等待直到 promise 被解决, 或 timertimeout fired flag 被设置, 以先发生者为准。

  10. 如果 promise 仍处于待定状态,且 timertimeout fired flag 已设置, 则返回错误,其错误码script timeout

  11. 如果 promise 以值 v 兑现, 则令 result 为使用 sessionvJSON 克隆, 并返回成功,其 数据为 result

  12. 如果 promise 以原因 r 被拒绝, 则令 result 为使用 sessionrJSON 克隆, 并返回错误,其错误 码javascript error,且数据为 result

13.2.2 执行异步脚本

HTTP 方法 URI 模板
POST /session/{session id}/execute/async

执行异步脚本命令 会使 JavaScript 作为匿名函数执行。 还会向该函数提供一个附加值作为最后一个参数。 这是一个可被调用以表示异步操作完成的函数。 提供给该函数的第一个参数会被序列化为 JSON,并由执行异步脚本返回。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. bodyarguments 为使用 参数 parameters trying从请求中提取脚本 参数的结果。

  2. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  3. Try 使用 session 处理任何用户提示

  4. timeoutsession会话超时脚本超时

  5. timer 为一个新的计时器

  6. 如果 timeout 不为 null:

    1. 使用 timertimeout 启动计时器

  7. promise一个新的 Promise

  8. 并行运行以下子步骤:

    1. resolvingFunctionsCreateResolvingFunctions(promise)。

    2. resolvingFunctions.[[Resolve]] 追加到 arguments

    3. scriptResult 为用参数 bodyarguments 调用 执行函数体的结果。

    4. 如果 scriptResult.[[Type]] 不是 normal,则以值 scriptResult.[[Value]] reject promise,并中止这些步骤。

      本规范的先前修订没有识别所提供脚本的 返回值。为了保留遗留行为, 返回值只有在其为 "thenable" 对象,或判断这一点会产生异常时, 才会影响命令。

    5. 如果 Type(scriptResult.[[Value]]) 不是 Object,则中止这些步骤。

    6. thenGet(scriptResult.[[Value]], "then")。

    7. 如果 then.[[Type]] 不是 normal,则以值 then.[[Value]] reject promise,并中止这些步骤。

    8. 如果 IsCallable(then.[[Type]]) 为 false, 则中止这些步骤。

    9. scriptPromisePromiseResolve(Promise, scriptResult.[[Value]])。

    10. scriptPromise 以值 v 兑现时, 以值 v resolve promise

    11. scriptPromise 以值 r 拒绝时, 以值 r reject promise

  9. 等待直到 promise 被解决, 或 timertimeout fired flag 被设置, 以先发生者为准。

  10. 如果 promise 仍处于待定状态,且 timertimeout fired flag 已设置, 则返回错误,其错误码script timeout

  11. 如果 promise 以值 v 兑现, 则令 result 为使用 sessionvJSON 克隆, 并返回成功,其 数据为 result

  12. 如果 promise 以原因 r 被拒绝, 则令 result 为使用 sessionrJSON 克隆, 并返回错误,其错误 码javascript error,且数据为 result

14. Cookie

本节描述与cookie 的交互,如 [RFC6265] 中所述。

[RFC6265] 将 cookie 描述为一个保存 cookie 数据的名称-值对, 后跟零个或多个描述其特征的属性-值对。

以下cookie 转换表 定义了与 WebDriver 相关的 cookie 概念、 它们在 [RFC6265] 中如何称呼、 它们映射到序列化 cookie中的哪些键, 以及在构造创建 cookie所需参数列表时 需要的属性-值键。

出于信息说明目的, 该表包含一个图例,用于说明该字段在提供给添加 Cookie序列化 cookie中是否可选, 并包含该字段的简要非规范性描述 以及其关联值的预期输入类型。

概念 RFC 6265 字段 JSON 键 属性键 可选 描述
Cookie 名称 name "name" cookie 的名称。
Cookie 值 value "value" cookie 值。
Cookie 路径 path "path" "Path" cookie 路径。 在添加 cookie时若省略, 则默认为 "/"。
Cookie 域 domain "domain" "Domain" cookie 可见的域。 在添加 cookie时若省略, 则默认为 session当前浏览 上下文活动文档URL
Cookie secure only secure-only-flag "secure" "Secure" cookie 是否为安全 cookie。 在添加 cookie时若省略, 则默认为 false。
Cookie HTTP only http-only-flag "httpOnly" "HttpOnly" cookie 是否为 HTTP only cookie。 在添加 cookie时若省略, 则默认为 false。
Cookie 过期时间 expiry-time "expiry" "Max-Age" cookie 的过期时间,以自 Unix 纪元以来的秒数指定。 在添加 cookie时若省略,则不得设置。
Cookie same site samesite "sameSite" "SameSite" cookie 是否应用 SameSite 策略。 在添加 cookie时若省略, 则默认为 None。 可设置为 LaxStrict

序列化 cookie是一个 JSON Object, 其中cookie的 [RFC6265] 字段 (列于cookie 转换表中) 使用 JSON 键 和来自cookie 存储的相关字段值进行映射。 可选字段可以省略。

为了获取与某个文档 关联的所有 cookie, 用户代理必须从给定文档地址cookie 存储中, 返回满足 [RFC6265] 中为 “HTTP API”计算 cookie-string 的算法第一步所列要求的cookie枚举集合。 返回的 cookie 必须包括 HttpOnly cookie

远程端被指示 创建 cookie时, 这等同于执行 [RFC6265] 第 5.3 节接收 cookie下描述的步骤, 但用户代理不得完全忽略接收到的 cookie (忽略步骤 1)。

为了在给定可选过滤参数 name(其为字符串)时删除 cookie

  1. 对于 session当前浏览上下文活动 文档所有关联 cookie中的每个cookie, 运行第一个匹配条件的子步骤:

    nameundefined
    name 等于cookie 名称

    cookie 过期时间 设置为过去的一个 Unix 时间戳

    否则
    不执行任何操作。

14.1 获取所有 Cookie

HTTP 方法 URI 模板
GET /session/{session id}/cookie

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. cookies 为一个新的List

  4. 对于 session当前浏览 上下文活动 文档所有关联 cookie中的每个 cookie

    1. serialized cookie序列化 cookie 的结果。

    2. serialized cookie 追加到 cookies

  5. 返回成功,其数据为 cookies

14.5 删除所有 Cookie

HTTP 方法 URI 模板
DELETE /session/{session id}/cookie

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. 删除 cookie,不提供过滤参数。

  4. 返回成功,其数据为null

15. 操作

Actions API 提供了一个低级接口, 用于向 Web 浏览器提供虚拟化设备输入。 从概念上说,Actions 命令将时间划分为一系列tick本地 端发送一系列操作, 这些操作对应于每个输入设备在每个tick期间状态的变化(如果有)。 例如,按下一个键 由一个操作序列表示, 该序列由一个按键输入设备和两个tick组成, 第一个包含一个 keyDown 操作, 第二个包含一个 keyUp 操作; 而捏合缩放输入则由一个操作序列表示, 该序列由三个tick 和两个类型为 touch 的指针输入设备组成, 每个设备都执行一系列操作:pointerDown, 后跟 pointerMove,然后是 pointerUp

15.1 操作选项

操作分派的配置由一个 操作 选项对象控制。它是一个结构,具有名为是 元素原点的字段,它是一组用于验证协议对象是否表示元素原点的步骤, 以及 获取元素 原点,它是一组 用于反序列化元素的步骤。

为了给定 sessionoriginbrowsing context获取 WebElement 原点:,

  1. 断言:browsing context当前 浏览上下文

  2. element 等于使用 sessionorigin trying获取已知 元素的结果。

  3. 返回成功,其数据为 element

15.2 输入源

输入源是一个提供输入 事件的虚拟设备。每个输入源都由一个特定于 该输入源类型的结构表示。 每个输入源都有一个input id,它作为键存储在输入状态映射中。

为了给定 input statetype 和可选的 subtype创建 输入源

  1. 运行与 type 的第一个匹配值相匹配的子步骤:

    "none"
    source创建 null 输入 源的结果。
    "key"
    source创建按键输入 源的结果。
    "pointer"
    source 为用 input statesubtype 创建指针 输入源的结果。
    "wheel"
    source创建滚轮输入 源的结果。
    否则:
    返回错误,其错误码invalid argument
  2. 返回成功,其数据为 source

15.2.1 Null 输入源

null 输入 源是一个输入源, 不与特定物理设备关联。null 输入 源没有类型特定项,并支持 以下操作:

操作 非规范性描述
pause 与整数参数一起使用,以指定 一个tick的持续时间, 或作为占位符,用于指示某个输入 源在特定tick期间不执行任何操作。

为了创建 null 输入源,返回一个新的null 输入 源

15.2.2 按键输入源

按键输入 源是一个输入源, 与键盘类型设备关联。

按键输入源具有以下项:

非规范性描述 默认值
pressed 表示当前按下按键的字符串集合。 空集合
alt 一个布尔值,指示 alt 修饰键是否被按下。 False
ctrl 一个布尔值,指示 ctrl 修饰键是否被按下。 False
meta 一个布尔值,指示 meta 修饰键是否被按下。 False
shift 一个布尔值,指示 shift 修饰键是否被按下。 False

按键输入源支持与null 输入源相同的 pause 操作, 以及以下操作:

操作 非规范性描述
keyDown 用于指示应按住某个特定按键。
keyUp 用于指示应释放一个已按下的按键。

为了创建按键输入源,返回一个新的按键 输入源,并将各项初始化为其默认值。

15.2.3 指针输入源

指针 输入源是一个输入源, 与指针类型输入设备关联。

指针输入源具有以下项:

非规范性描述 默认值
subtype 指针设备的类型。可以是 "mouse"、 "pen" 或 "touch"。
pointerId 指针设备的数值 id。这是一个正整数, 其中值 0 和 1 保留给 mouse 类型指针。
pressed 表示当前按下的指针按钮的无符号整数集合。 空集合
x 表示指针在视口坐标中 x 位置的无符号整数。 0
y 表示指针在视口坐标中 y 位置的无符号整数。 0

指针输入源支持与 null 输入源相同的 pause 操作,以及以下操作:

操作 非规范性描述
pointerDown 用于指示指针应以某种方式被按下, 例如按住按钮(对于鼠标)或接触活动表面 (对于触摸或笔设备)。
pointerUp 用于指示指针应以某种方式被释放, 例如释放鼠标按钮,或将笔或触摸设备 从活动表面移开。
pointerMove 用于指示屏幕上指针应移动到的位置, 无论其处于活动(按下)还是非活动状态。
pointerCancel 用于取消指针操作。

为了在给定 input statesubtype创建指针输入源对象,返回一个新的指针输入 源,其 subtype 设置为 subtype,pointerId 设置为 使用 input statesubtype 获取指针 id的结果, 并将其他项设置为其默认值。

15.2.4 滚轮输入源

滚轮 输入源是一个输入源, 与滚轮类型输入设备关联。滚轮输入 源没有类型特定项,并支持与null 输入 源相同的 pause 操作,以及以下操作:

操作 非规范性描述
scroll 用于指示滚轮向下、向上、向右或向左滚动, 以使页面向下、向上、向右或向左滚动。

为了创建滚轮输入源,返回一个新的滚轮 输入源

15.3 输入状态

输入状态 表示一组输入源的整体状态。 输入状态具有以下项:

为了给定 sessionbrowsing context获取 输入状态

  1. 断言:browsing context顶级浏览 上下文

  2. input state mapsession浏览上下文 输入状态映射

  3. 如果 input state map包含 browsing context,则将 input state map[browsing context] 设置为创建输入 状态的结果。

  4. 返回 input state map[browsing context]。

为了给定 sessionbrowsing context重置 输入状态

  1. 断言:browsing context顶级浏览 上下文

  2. input state mapsession浏览上下文 输入状态映射

  3. 如果 input state map[browsing context] 存在,则移除 input state map[browsing context]。

为了创建 输入状态

  1. input state 为一个输入状态,其 输入状态映射设置为空映射,且输入 取消列表设置为空列表。

  2. 返回 input state

为了给定 input stateinput idsource添加输入 源

  1. input state mapinput state输入状态映射

  2. input state map[input id] 设置为 source

为了给定 input stateinput id移除输入 源

  1. 断言:input state输入取消列表中的任何项都没有等于 input id 的 id。

  2. input state mapinput state输入状态映射

  3. 移除 input state map[input id]。

为了给定 input stateinput id获取输入 源

  1. input state mapinput state输入状态映射

  2. 如果 input state map[input id] 存在, 返回 input state map[input id]。

  3. 返回 undefined。

为了给定 input statetypeinput id 和 可选的 subtype获取或创建输入源

  1. source 为用 input stateinput id 获取输入源的结果。

  2. 如果 source 不是 undefined 且 source 的 type 不等于 type,或者 source指针输入源,则返回错误,其错误 码invalid argument

  3. 如果 source 为 undefined,则将 source 设置为 使用 input statetype trying创建输入 源的结果。

  4. 返回成功,其数据为 source

全局按键 状态是一个结构,其项为 pressed、 altKey、ctrlKey、metaKey 和 shiftKey。

为了给定 input state获取 全局按键状态

  1. input state mapinput state输入状态映射

  2. sources 为使用 input state map 获取值的结果。

  3. key state 为一个新的全局按键状态, 其 pressed 设置为空集合, altKeyctrlKeymetaKeyshiftKey 设置为 false。

  4. 对于 sources 中的每个 source

    1. 如果 source 不是按键输入源, 则继续此循环的第一步。

    2. key statepressed 项设置为 其当前值与 source 的 pressed 项的并集。

    3. 如果 sourcealt 项为 true, 则将 key statealtKey 项设置为 true。

    4. 如果 sourcectrl 项为 true, 则将 key statectrlKey 项设置为 true。

    5. 如果 sourcemeta 项为 true, 则将 key statemetaKey 项设置为 true。

    6. 如果 sourceshift 项为 true, 则将 key stateshiftKey 项设置为 true。

  5. 返回 key state

为了给定 input statesubtype获取指针 id

  1. 如果 subtype 是 "mouse",则令 minimum id 为 0,否则为 2。
  2. pointer ids 为空集合。
  3. sources 为使用 input state输入状态映射 获取值的结果。

  4. 对于 sources 中的每个 source.:

    1. 如果 source指针输入 源, 则将 source 的 pointerId 追加到 pointer ids

  5. 返回大于或等于 minimum id 且未包含在 pointer ids 中的最小整数。

15.4 Tick

tick 是可以执行操作的基本时间单位。在一个tick期间,每个输入源都有 一个被分配的操作——可能是一个 noop pause 操作——该操作可能 导致用户代理内部状态发生变化,并最终 导致 DOM 事件在页面上被触发。下一个tick会在 用户代理有机会处理当前tick中生成的所有 DOM 事件之后开始。

异步 等待是指在等待某事发生的同时, 允许浏览器继续处理 事件循环

在最低层面,操作的行为旨在尽可能接近地模拟 远程端使用真实输入设备时的行为, 并且实现策略可能涉及例如将合成事件注入到浏览器事件 循环中。因此,分派操作的步骤不可避免地 会进入实现特定的领域。不过,仍有某些 内容可观察效果必须在各实现之间保持一致。 为了适应这一点,本规范要求 远程端浏览上下文 context 以及一个 list of events 及其属性上执行实现特定的操作 分派步骤。这些步骤 必须等价于在 context 上执行给定的输入设备操作, 使得与 list of events 中各条目对应的受信任事件被分派。

15.5 处理操作

从请求中提取 操作序列的算法会接受 表示操作序列的 JSON Object,验证 输入,并返回一个作为输入 JSON 转置的数据结构, 使得要在单个tick 中执行的操作会被分组在一起。

为了给定 sourcex offsety offsetoriginbrowsing contextactions options获取相对于原点的坐标

  1. 运行 origin 的第一个匹配值的子步骤:

    "viewport"
    1. x 等于 x offset, 令 y 等于 y offset

    "pointer"
    1. start x 等于 sourcex 属性。

    2. start y 等于 sourcey 属性。

    3. x 等于 start x + x offset,令 y 等于 start y + y offset

    否则
    1. element 为使用 originbrowsing context trying 去运行 actions options获取元素原点 步骤的结果。

    2. 如果 element 为 null,则返回错误,其错误 码no such element

    3. x elementy element 为计算 element视图内中心 点的结果。

    4. x 等于 x element + x offset,并令 y 等于 y element + y offset

  2. 返回 (x, y)

为了给定 input stateparametersactions options提取操作序列

  1. actions 为从 parameters获取名为 "actions" 的属性的结果。

  2. 如果 actionsundefined 或不是 Array,则返回错误,其错误 码invalid argument

  3. actions by tick 为空List

  4. 对于 actions 中与索引属性对应的每个值 action sequence

    1. source actions 为给定 input stateaction sequenceactions optionstrying处理输入源操作序列的结果。

    2. 对于 source actions 中的每个 action

      1. iactionsource actions 中的从零开始的索引。

      2. 如果 actions by tick 的长度小于 i + 1,则向 actions by tick 追加一个新的List

      3. action 追加到 actions by tick 中索引为 iList

  5. 返回成功,其数据为 actions by tick

当要求给定 input stateaction sequenceactions options 处理输入源操作 序列时,远程端 必须:

  1. type 为从 action sequence 获取名为 "type" 的属性的结果。

  2. 如果 type 不是 "key"、"pointer"、 "wheel" 或 "none", 则返回一个错误,其 错误码invalid argument

  3. id 为从 action sequence 获取 "id" 属性的结果。

  4. 如果 idundefined 或不是 String, 则返回错误,其错误码invalid argument

  5. 如果 type 等于 "pointer", 则令 parameters data 为从 action sequence 获取 "parameters" 属性的结果。 然后令 parameters 为以 parameters data 作为参数 trying处理指针参数的结果。

  6. source 为给定 input statetypeid trying to 获取或 创建输入源的结果。

  7. 如果 parameters 不是 undefined, 则如果其 pointerType 属性不等于 source 的 subtype 属性,返回一个错误, 其错误码invalid argument

  8. action items 为从 action sequence 获取名为 "actions" 的属性的结果。

  9. 如果 action items 不是 Array, 则返回错误,其错误码invalid argument

  10. actions 为一个新的列表。

  11. 对于 action items 中的每个 action item

    1. 如果 action item 不是Object, 则返回错误,其错误 码invalid argument

    2. 如果 type 是 "none", 则令 action 为以 idaction item 作为参数, trying处理 null 操作的结果。

    3. 否则,如果 type 是 "key", 则令 action 为以 idaction item 作为参数, trying处理 按键操作的结果。

    4. 否则,如果 type 是 "pointer", 则令 action 为以 idparametersaction itemactions options 作为参数, trying处理 指针操作的结果。

    5. 否则,如果 type 是 "wheel", 则令 action 为以 idaction itemactions options 作为参数, trying处理 滚轮操作的结果。

    6. action 追加到 actions

  12. 返回成功,其数据为 actions

默认指针参数由一个对象组成, 该对象的属性 pointerType 设置为 mouse

为了给定 parameters data处理指针参数

  1. parameters默认指针 参数

  2. 如果 parameters dataundefined, 则返回成功,其数据为 parameters

  3. 如果 parameters data 不是Object, 则返回错误,其错误码invalid argument

  4. pointer type 为从 parameters data 获取名为 "pointerType" 的属性的结果。

  5. 如果 pointer type 不是 undefined

    1. 如果 pointer type 不具有以下值之一: "mouse"、 "pen" 或 "touch", 则返回错误,其错误 码invalid argument

    2. parameterspointerType 属性 设置为 pointer type

  6. 返回成功,其数据为 parameters

使用参数 idtypesubtype 构造的 操作对象是 一个对象,其属性 id 设置为 id,type 设置为 type,subtype 设置 为 subtype。具体的操作对象会由本规范中的其他算法 添加更多属性。

为了给定 idaction item处理 null 操作

  1. subtype 为从 action item 获取名为 "type" 的属性的结果。

  2. 如果 subtype 不是 "pause", 则返回错误,其错误码invalid argument

  3. action 为一个使用参数 id"none"subtype 构造的操作对象

  4. result 为以 action itemaction 作为参数, trying处理 pause 操作的结果。

  5. 返回 result

为了给定 idaction item处理 按键操作

  1. subtype 为从 action item 获取名为 "type" 的属性的结果。

  2. 如果 subtype 不是以下值之一: "keyUp"、 "keyDown" 或 "pause", 则返回一个错误,其错误码invalid argument

  3. action 为一个使用参数 id、 "key" 和 subtype 构造的操作对象

  4. 如果 subtype 是 "pause", 则令 result 为以 action itemaction 作为参数 trying处理 pause 操作的结果, 并返回 result

  5. key 为从 action item 获取名为 "value" 的属性的结果。

  6. 如果 key 不是一个包含单个unicode 码点String 还是字素簇? 则返回错误,其错误码invalid argument

  7. action 上的 value 属性设置为 key

  8. 返回成功,其数据为 action

为了给定 idparametersaction itemaction options处理 指针操作

  1. subtype 为从 action item 获取名为 "type" 的属性的结果。

  2. 如果 subtype 不是以下值之一: "pause"、 "pointerUp"、 "pointerDown"、 "pointerMove" 或 "pointerCancel", 则返回一个错误,其错误码invalid argument

  3. action 为一个使用参数 id、 "pointer" 和 subtype 构造的操作对象

  4. 如果 subtype 是 "pause", 则令 result 为以 action itemactionactions options 作为参数, trying处理 pause 操作的结果, 并返回 result

  5. actionpointerType 属性设置为 等于 parameterspointerType 属性。

  6. 如果 subtype 是 "pointerUp" 或 "pointerDown", 则以 action itemaction 作为参数 处理 pointer up 或 pointer down 操作。 如果这样做产生错误,则返回该错误

  7. 如果 subtype 是 "pointerMove", 则以 action itemactionactions options 作为参数 处理 pointer move 操作。 如果这样做产生错误,则返回 该错误

  8. 如果 subtype 是 "pointerCancel", 处理 pointer cancel 操作。 如果这样做产生错误,则返回该错误

  9. 返回成功,其数据为 action

为了给定 idaction itemactions options处理 滚轮操作

  1. subtype 为从 action item 获取名为 "type" 的属性的结果。

  2. 如果 subtype 不是值 "pause" 或 "scroll", 则返回一个错误,其错误码invalid argument

  3. action 为一个使用参数 id、 "wheel" 和 subtype 构造的操作对象

  4. 如果 subtype 是 "pause", 则令 result 为以 action itemaction 作为参数, trying处理 pause 操作的结果, 并返回 result

  5. duration 为从 action item 获取名为 "duration" 的属性的结果。

  6. 如果 duration 不是 undefined,且 duration 不是大于或等于 0 的Integer,则返回错误, 其错误码invalid argument

  7. actionduration 属性 设置为 duration

  8. origin 为从 action item 获取 origin 属性的结果。

  9. 如果 originundefined,则令 origin 等于 "viewport"。

  10. 如果 origin 不等于 "viewport", 或 actions options是元素原点步骤在给定 origin 时返回 false,则返回错误,其 错误码invalid argument

  11. actionorigin 属性 设置为 origin

  12. x 为从 action item 获取 x 属性的结果。

  13. 如果 x 不是Integer,则返回错误, 其错误码invalid argument

  14. actionx 属性设置为 x

  15. y 为从 action item 获取 y 属性的结果。

  16. 如果 y 不是Integer,则返回错误, 其错误码invalid argument

  17. actiony 属性设置为 y

  18. deltaX 为从 action item 获取 deltaX 属性的结果。

  19. 如果 deltaX 不是Integer, 则返回错误,其错误码invalid argument

  20. actiondeltaX 属性设置为 deltaX

  21. deltaY 为从 action item 获取 deltaY 属性的结果。

  22. 如果 deltaY 不是Integer, 则返回错误,其错误码invalid argument

  23. actiondeltaY 属性设置为 deltaY

  24. 返回成功,其数据为 action

为了给定 action itemaction处理 pause 操作

  1. duration 为从 action item 获取 "duration" 属性的结果。

  2. 如果 duration 不是 undefinedduration 不是大于或等于 0 的Integer, 则返回错误,其错误码invalid argument

  3. actionduration 属性 设置为 duration

  4. 返回成功,其数据为 action

为了给定 action itemaction 处理 pointer up 或 pointer down 操作

  1. button 为从 action item 获取 button 属性的结果。

  2. 如果 button 不是大于或等于 0 的Integer,则返回错误,其错误码invalid argument

  3. actionbutton 属性 设置为 button

  4. width 为从 action item 获取 width 属性的结果。

  5. 如果 width 不是 undefinedwidth 不是大于或等于 0 的Number,则返回错误,其错误码invalid argument

  6. actionwidth 属性 设置为 width

  7. height 为从 action item 获取 height 属性的结果。

  8. 如果 height 不是 undefinedheight 不是大于或等于 0 的Number,则返回错误,其错误码invalid argument

  9. actionheight 属性 设置为 height

  10. pressure 为从 action item 获取 pressure 属性的结果。

  11. 如果 pressure 不是 undefinedpressure 不是大于或等于 0 且小于或等于 1 的Number,则返回错误,其 错误码invalid argument

  12. actionpressure 属性 设置为 pressure

  13. tangentialPressure 为从 action item 获取 tangentialPressure 属性的结果。

  14. 如果 tangentialPressure 不是 undefinedtangentialPressure 不是大于或等于 -1 且小于或等于 1 的Number,则返回错误, 其错误码invalid argument

  15. actiontangentialPressure 属性 设置为 tangentialPressure

  16. tiltX 为从 action item 获取 tiltX 属性的结果。

  17. 如果 tiltX 不是 undefinedtiltX 不是大于或等于 -90 且小于或等于 90 的Integer,则返回错误,其 错误码invalid argument

  18. actiontiltX 属性 设置为 tiltX

  19. tiltY 为从 action item 获取 tiltY 属性的结果。

  20. 如果 tiltY 不是 undefinedtiltY 不是大于或等于 -90 且小于或等于 90 的Integer,则返回错误,其 错误码invalid argument

  21. actiontiltY 属性 设置为 tiltY

  22. twist 为从 action item 获取 twist 属性的结果。

  23. 如果 twist 不是 undefinedtwist 不是大于或等于 0 且小于或等于 359 的Integer,则返回错误,其 错误码invalid argument

  24. actiontwist 属性 设置为 twist

  25. altitudeAngle 为从 action item 获取 altitudeAngle 属性的结果。

  26. 如果 altitudeAngle 不是 undefinedaltitudeAngle 不是大于或等于 0 且小于或等于 π/2 的Number,则返回错误,其 错误码invalid argument

  27. actionaltitudeAngle 属性 设置为 altitudeAngle

  28. azimuthAngle 为从 action item 获取 azimuthAngle 属性的结果。

  29. 如果 azimuthAngle 不是 undefinedazimuthAngle 不是大于或等于 0 且小于或等于 2π 的Number,则返回错误,其 错误码invalid argument

  30. actionazimuthAngle 属性 设置为 azimuthAngle

  31. 返回成功,其数据为 null

为了给定 action itemactionactions options处理 pointer move 操作

  1. duration 为从 action item 获取 duration 属性的结果。

  2. 如果 duration 不是 undefinedduration 不是大于或等于 0 的Integer, 则返回错误,其错误码invalid argument

  3. actionduration 属性 设置为 duration

  4. origin 为从 action item 获取 origin 属性的结果。

  5. 如果 originundefined,则令 origin 等于 "viewport"。

  6. 如果 origin 不等于 "viewport" 或 "pointer",且给定 origin 时, actions options是 元素原点步骤返回 false, 则返回错误,其错误码invalid argument

  7. actionorigin 属性 设置为 origin

  8. x 为从 action item 获取 x 属性的结果。

  9. 如果 x 不是Number,则返回错误, 其错误码invalid argument

  10. actionx 属性 设置为 x

  11. y 为从 action item 获取 y 属性的结果。

  12. 如果 y 不是Number,则返回错误, 其错误码invalid argument

  13. actiony 属性 设置为 y

  14. width 为从 action item 获取 width 属性的结果。

  15. 如果 width 不是 undefinedwidth 不是大于或等于 0 的Number,则返回错误,其错误码invalid argument

  16. actionwidth 属性 设置为 width

  17. height 为从 action item 获取 height 属性的结果。

  18. 如果 height 不是 undefinedheight 不是大于或等于 0 的Number,则返回错误,其错误码invalid argument

  19. actionheight 属性 设置为 height

  20. pressure 为从 action item 获取 pressure 属性的结果。

  21. 如果 pressure 不是 undefinedpressure 不是大于或等于 0 且小于或等于 1 的Number,则返回错误,其 错误码invalid argument

  22. actionpressure 属性 设置为 pressure

  23. tangentialPressure 为从 action item 获取 tangentialPressure 属性的结果。

  24. 如果 tangentialPressure 不是 undefinedtangentialPressure 不是大于或等于 -1 且小于或等于 1 的Number,则返回错误, 其错误码invalid argument

  25. actiontangentialPressure 属性 设置为 tangentialPressure

  26. tiltX 为从 action item 获取 tiltX 属性的结果。

  27. 如果 tiltX 不是 undefinedtiltX 不是大于或等于 -90 且小于或等于 90 的Integer,则返回错误,其 错误码invalid argument

  28. actiontiltX 属性 设置为 tiltX

  29. tiltY 为从 action item 获取 tiltY 属性的结果。

  30. 如果 tiltY 不是 undefinedtiltY 不是大于或等于 -90 且小于或等于 90 的Integer,则返回错误,其 错误码invalid argument

  31. actiontiltY 属性 设置为 tiltY

  32. twist 为从 action item 获取 twist 属性的结果。

  33. 如果 twist 不是 undefinedtwist 不是大于或等于 0 且小于或等于 359 的Integer,则返回错误,其 错误码invalid argument

  34. actiontwist 属性 设置为 twist

  35. altitudeAngle 为从 action item 获取 altitudeAngle 属性的结果。

  36. 如果 altitudeAngle 不是 undefinedaltitudeAngle 不是大于或等于 0 且小于或等于 π/2 的Number,则返回错误,其 错误码invalid argument

  37. actionaltitudeAngle 属性 设置为 altitudeAngle

  38. azimuthAngle 为从 action item 获取 azimuthAngle 属性的结果。

  39. 如果 azimuthAngle 不是 undefinedazimuthAngle 不是大于或等于 0 且小于或等于 2π 的Number,则返回错误,其 错误码invalid argument

  40. actionazimuthAngle 属性 设置为 azimuthAngle

  41. 返回成功,其数据为 null

15.6 分派操作

分派操作算法接受一个按 tick 分组的操作列表,然后使每个操作在序列中 适当的点运行。

为了给定 input state等待操作队列令牌

  1. token 为一个新的唯一标识符。

  2. token 入队到 input state操作队列

  3. 等待 token 成为 input state操作队列中的第一项。

为了给定 input stateactions by tickbrowsing contextactions options分派 操作

  1. 使用 input state 等待操作队列令牌

  2. actions result 为使用 input stateactions by tickbrowsing contextactions options 内部分派操作的结果。

  3. input state操作队列出队。

    断言:这会返回 token

  4. 返回 actions result

为了给定 input stateactions by tickbrowsing contextactions options内部 分派操作

  1. 对于 actions by tick 中的每个项 tick actions

    1. 如果 browsing context 不再打开,则返回 错误,其错误码no such window
    2. tick duration 为以 tick actions 为参数 计算 tick 持续时间的结果。

    3. Try 使用 input statetick actionstick durationbrowsing contextactions options 分派 tick 操作

    4. 等待直到以下条件全部满足:

      • 不存在由上一次调用分派 tick 操作 步骤产生的待处理异步 等待

      • 用户代理事件循环已转动足够次数, 以处理由上一次调用 分派 tick 操作步骤生成的 DOM 事件。

      • 至少已经过 tick duration 毫秒。

  2. 返回成功,其数据为 null

为了给定 tick actions 计算 tick 持续时间

  1. max duration 为 0。

  2. 对于 tick actions 中的每个 action object

    1. durationundefined

    2. 如果 action object 的 subtype 属性设置为 "pause",或者 action object 的 type 属性 设置为 "pointer" 且 subtype 属性设置为 "pointerMove",或者 action object 的 type 属性设置为 "wheel" 且 subtype 属性设置为 "scroll",则令 duration 等于 action objectduration 属性。

    3. 如果 duration 不是 undefined, 且 duration 大于 max duration, 则令 max duration 等于 duration。

  3. 返回 max duration

为了给定 input statetick actionstick durationbrowsing contextactions options分派 tick 操作

  1. 对于 tick actions 中的每个 action object

    1. input id 等于 action object 的 id 属性的值。

    2. source type 等于 action object 的 type 属性的值。

    3. source 为给定 input stateinput id 获取 输入 源的结果。

    4. 断言:source 不是 undefined。

    5. global key state 为使用 input state 获取 全局按键状态的结果。

    6. subtypeaction object 的 subtype。

    7. algorithm 为下表中 source type 列为 source typesubtype 列等于 subtype 的行的 dispatch action algorithm 列的值。

      source type subtype 分派操作算法
      "none" "pause" 分派 pause 操作
      "key" "pause" 分派 pause 操作
      "key" "keyDown" 分派 keyDown 操作
      "key" "keyUp" 分派 keyUp 操作
      "pointer" "pause" 分派 pause 操作
      "pointer" "pointerDown" 分派 pointerDown 操作
      "pointer" "pointerUp" 分派 pointerUp 操作
      "pointer" "pointerMove" 分派 pointerMove 操作
      "pointer" "pointerCancel" 分派 pointerCancel 操作
      "wheel" "pause" 分派 pause 操作
      "wheel" "scroll" 分派 scroll 操作
    8. Try 使用参数 action objectsourceglobal key statetick durationbrowsing contextactions options 运行 algorithm
    9. 如果 subtype 是 "keyDown",则将 action object 的副本(其 subtype 属性改为 "keyUp")追加到 input state输入取消列表

    10. 如果 subtype 是 "pointerDown",则将 action object 的副本(其 subtype 属性改为 "pointerUp")追加到 input state输入取消列表

  2. 返回成功,其数据为 null

为了给定 input stateactionsbrowsing contextactions options分派操作列表

  1. tick actions 为列表 «actions»

  2. actions by tick 为列表 «tick actions»。

  3. 返回使用 input stateactions by tickbrowsing contextactions options 分派操作的结果。

15.6.1 通用操作

为了给定 action objectsourceglobal key statetick durationbrowsing contextactions options分派 pause 操作

  1. 返回成功,其数据为 null

15.6.2 键盘操作

原始按键 key规范化按键值 是:如果 key 出现在下表中,则为包含 keyunicode 码点的行中第二列的字符串值,否则为 key

key 的码点 规范化按键值
\uE000 "Unidentified"
\uE001 "Cancel"
\uE002 "Help"
\uE003 "Backspace"
\uE004 "Tab"
\uE005 "Clear"
\uE006 "Return"
\uE007 "Enter"
\uE008 "Shift"
\uE009 "Control"
\uE00A "Alt"
\uE00B "Pause"
\uE00C "Escape"
\uE00D " "
\uE00E "PageUp"
\uE00F "PageDown"
\uE010 "End"
\uE011 "Home"
\uE012 "ArrowLeft"
\uE013 "ArrowUp"
\uE014 "ArrowRight"
\uE015 "ArrowDown"
\uE016 "Insert"
\uE017 "Delete"
\uE018 ";"
\uE019 "="
\uE01A "0"
\uE01B "1"
\uE01C "2"
\uE01D "3"
\uE01E "4"
\uE01F "5"
\uE020 "6"
\uE021 "7"
\uE022 "8"
\uE023 "9"
\uE024 "*"
\uE025 "+"
\uE026 ","
\uE027 "-"
\uE028 "."
\uE029 "/"
\uE031 "F1"
\uE032 "F2"
\uE033 "F3"
\uE034 "F4"
\uE035 "F5"
\uE036 "F6"
\uE037 "F7"
\uE038 "F8"
\uE039 "F9"
\uE03A "F10"
\uE03B "F11"
\uE03C "F12"
\uE03D "Meta"
\uE040 "ZenkakuHankaku"
\uE050 "Shift"
\uE051 "Control"
\uE052 "Alt"
\uE053 "Meta"
\uE054 "PageUp"
\uE055 "PageDown"
\uE056 "End"
\uE057 "Home"
\uE058 "ArrowLeft"
\uE059 "ArrowUp"
\uE05A "ArrowRight"
\uE05B "ArrowDown"
\uE05C "Insert"
\uE05D "Delete"

keycode 是下表中第一列或第二列中包含 key 的行的最后一列中的值, 如果存在这样的行; 否则为 undefined

shifted 字符 是指出现在下表第二列中的字符。

Key Alternate Key code
"`" "~" "Backquote"
"\" "|" "Backslash"
"\uE003" "Backspace"
"[" "{" "BracketLeft"
"]" "}" "BracketRight"
"," "<" "Comma"
"0" ")" "Digit0"
"1" "!" "Digit1"
"2" "@" "Digit2"
"3" "#" "Digit3"
"4" "$" "Digit4"
"5" "%" "Digit5"
"6" "^" "Digit6"
"7" "&" "Digit7"
"8" "*" "Digit8"
"9" "(" "Digit9"
"=" "+" "Equal"
"<" ">" "IntlBackslash"
"a" "A" "KeyA"
"b" "B" "KeyB"
"c" "C" "KeyC"
"d" "D" "KeyD"
"e" "E" "KeyE"
"f" "F" "KeyF"
"g" "G" "KeyG"
"h" "H" "KeyH"
"i" "I" "KeyI"
"j" "J" "KeyJ"
"k" "K" "KeyK"
"l" "L" "KeyL"
"m" "M" "KeyM"
"n" "N" "KeyN"
"o" "O" "KeyO"
"p" "P" "KeyP"
"q" "Q" "KeyQ"
"r" "R" "KeyR"
"s" "S" "KeyS"
"t" "T" "KeyT"
"u" "U" "KeyU"
"v" "V" "KeyV"
"w" "W" "KeyW"
"x" "X" "KeyX"
"y" "Y" "KeyY"
"z" "Z" "KeyZ"
"-" "_" "Minus"
"." "." "Period"
"'" """ "Quote"
";" ":" "Semicolon"
"/" "?" "Slash"
"\uE00A" "AltLeft"
"\uE052" "AltRight"
"\uE009" "ControlLeft"
"\uE051" "ControlRight"
"\uE006" "Enter"
"\uE00B" "Pause"
"\uE03D" "MetaLeft"
"\uE053" "MetaRight"
"\uE008" "ShiftLeft"
"\uE050" "ShiftRight"
" " "\uE00D" "Space"
"\uE004" "Tab"
"\uE017" "Delete"
"\uE010" "End"
"\uE002" "Help"
"\uE011" "Home"
"\uE016" "Insert"
"\uE00F" "PageDown"
"\uE00E" "PageUp"
"\uE015" "ArrowDown"
"\uE012" "ArrowLeft"
"\uE014" "ArrowRight"
"\uE013" "ArrowUp"
"\uE00C" "Escape"
"\uE031" "F1"
"\uE032" "F2"
"\uE033" "F3"
"\uE034" "F4"
"\uE035" "F5"
"\uE036" "F6"
"\uE037" "F7"
"\uE038" "F8"
"\uE039" "F9"
"\uE03A" "F10"
"\uE03B" "F11"
"\uE03C" "F12"
"\uE019" "NumpadEqual"
"\uE01A" "\uE05C" "Numpad0"
"\uE01B" "\uE056" "Numpad1"
"\uE01C" "\uE05B" "Numpad2"
"\uE01D" "\uE055" "Numpad3"
"\uE01E" "\uE058" "Numpad4"
"\uE01F" "Numpad5"
"\uE020" "\uE05A" "Numpad6"
"\uE021" "\uE057" "Numpad7"
"\uE022" "\uE059" "Numpad8"
"\uE023" "\uE054" "Numpad9"
"\uE025" "NumpadAdd"
"\uE026" "NumpadComma"
"\uE028" "\uE05D" "NumpadDecimal"
"\uE029" "NumpadDivide"
"\uE007" "NumpadEnter"
"\uE024" "NumpadMultiply"
"\uE027" "NumpadSubtract"

The 按键 位置 for key 是下表中第一列出现 key 的行的 最后一列中的值,如果存在这样的行;否则 为 0

key 的码点 描述 位置
\uE007 Enter 1
\uE008 Left Shift 1
\uE009 Left Control 1
\uE00A Left Alt 1
\uE019 Numpad = 3
\uE01A Numpad 0 3
\uE01B Numpad 1 3
\uE01C Numpad 2 3
\uE01D Numpad 3 3
\uE01E Numpad 4 3
\uE01F Numpad 5 3
\uE020 Numpad 6 3
\uE021 Numpad 7 3
\uE022 Numpad 8 3
\uE023 Numpad 9 3
\uE024 Numpad * 3
\uE025 Numpad + 3
\uE026 Numpad , 3
\uE027 Numpad - 3
\uE028 Numpad . 3
\uE029 Numpad / 3
\uE03D Left Meta 1
\uE050 Right Shift 2
\uE051 Right Control 2
\uE052 Right Alt 2
\uE053 Right Meta 2
\uE054 Numpad PageUp 3
\uE055 Numpad PageDown 3
\uE056 Numpad End 3
\uE057 Numpad Home 3
\uE058 Numpad ArrowLeft 3
\uE059 Numpad ArrowUp 3
\uE05A Numpad ArrowRight 3
\uE05B Numpad ArrowDown 3
\uE05C Numpad Insert 3
\uE05D Numpad Delete 3

为了给定 action objectsourceglobal key statetick durationbrowsing contextactions options分派 keyDown 操作

  1. raw key 等于 action objectvalue 属性。

  2. key 等于 raw key规范化按键值

  3. 如果 sourcepressed 属性 包含 key,则令 repeat 为 true,否则 令 repeat 为 false。

  4. coderaw keycode

  5. locationraw key按键位置

  6. charCodekeyCodewhichcharCodekeyCodewhich 属性的实现特定值, 这些值适合 102 键美式键盘上具有 key key 和 location location 的按键, 并遵循 [UI-EVENTS] 中的指导。

  7. 如果 key"Alt",则令 sourcealt 属性为 true。

  8. 如果 key"Shift",则令 sourceshift 属性为 true。

  9. 如果 key"Control",则令 sourcectrl 属性为 true。

  10. 如果 key"Meta",则令 sourcemeta 属性为 true。

  11. key 添加到 sourcepressed 属性。

  12. browsing context执行 实现特定的操作分派步骤, 等价于按照 [UI-EVENTS] 的要求按下键盘上的一个键, 并在适当时产生以下事件以及指定属性。这总会产生至少包含 一个 keyDown 事件在内的事件。

    • keyDown 及其属性:
      属性
      key key
      code code
      location location
      altKey sourcealt 属性
      shiftKey sourceshift 属性
      ctrlKey sourcectrl 属性
      metaKey sourcemeta 属性
      repeat repeat
      isComposing false
      charCode charCode
      keyCode keyCode
      which which
    • keyPress 及其属性:
      属性
      key key
      code code
      location location
      altKey sourcealt 属性
      shiftKey sourceshift 属性
      ctrlKey sourcectrl 属性
      metaKey sourcemeta 属性
      repeat repeat
      isComposing false
      charCode charCode
      keyCode keyCode
      which which
  13. 返回成功,其数据为 null

为了给定 action objectsourceglobal key statetick durationbrowsing contextactions options分派 keyUp 操作

  1. raw key 等于 action objectvalue 属性。

  2. key 等于 raw key规范化按键值

  3. 如果 sourcepressed 项 不包含 key,则返回。

  4. coderaw keycode

  5. locationraw key按键位置

  6. charCodekeyCodewhichcharCodekeyCodewhich 属性的实现特定值, 这些值适合 102 键美式键盘上具有 key key 和 location location 的按键, 并遵循 [UI-EVENTS] 中的指导。

  7. 如果 key 是 "Alt",则令 sourcealt 属性为 false。

  8. 如果 key 是 "Shift",则令 sourceshift 属性为 false。

  9. 如果 key"Control",则令 sourcectrl 属性为 false。

  10. 如果 key"Meta",则令 sourcemeta 属性为 false。

  11. sourcespressed 属性中移除 key

  12. browsing context执行 实现特定的操作分派步骤, 等价于按照 [UI-EVENTS] 的要求释放键盘上的一个键, 并产生至少以下事件以及指定属性:

    • keyup, 及其属性:
      属性
      key key
      code code
      location location
      altKey sourcealtKey 属性
      shiftKey sourceshift 属性
      ctrlKey sourcectrl 属性
      metaKey sourcemeta 属性
      repeat false
      isComposing false
      charCode charCode
      keyCode keyCode
      which which
  13. 返回成功,其数据为 null

15.6.3 指针操作

为了给定 action objectsourceglobal key statetick durationbrowsing contextactions options分派 pointerDown 操作

  1. pointerType 等于 action objectpointerType 属性。

  2. button 等于 action objectbutton 属性。

  3. 如果 sourcepressed 属性 包含 button,则返回成功,其数据为 null

  4. x 等于 sourcex 属性。

  5. y 等于 sourcey 属性。

  6. button 添加到与 sourcepressed 属性对应的集合中,并 令 buttons 为该属性所得的值。

  7. width 等于 action objectwidth 属性。

  8. height 等于 action objectheight 属性。

  9. pressure 等于 action objectpressure 属性。

  10. tangentialPressure 等于 action objecttangentialPressure 属性。

  11. tiltX 等于 action objecttiltX 属性。

  12. tiltY 等于 action objecttiltY 属性。

  13. twist 等于 action objecttwist 属性。

  14. altitudeAngle 等于 action objectaltitudeAngle 属性。

  15. azimuthAngle 等于 action objectazimuthAngle 属性。

  16. browsing context执行实现特定的操作分派步骤, 等价于按下 pointerId 等于 source 的 pointerId、 类型为 pointerType 的指针上编号为 button 的按钮, 该指针位于视口 x 坐标 x、 视口 y 坐标 y,具有 widthheightpressuretangentialPressuretiltXtiltYtwistaltitudeAngleazimuthAngle,并按下 buttons 按钮, 且符合 [UI-EVENTS] 和 [POINTER-EVENTS] 的要求。将 ctrlKeyshiftKeyaltKeymetaKey 设置为 global key state 中对应项的值。未通过 webdriver API 暴露的指针类型特定属性必须设置为 不支持该属性的硬件所指定的默认值。

  17. 返回成功,其数据为 null

为了给定 action objectsourceglobal key statetick durationbrowsing contextactions options分派 pointerUp 操作

  1. pointerType 等于 action objectpointerType 属性。

  2. button 等于 action objectbutton 属性。

  3. 如果 sourcepressed 属性 不包含 button, 则返回成功,其数据为 null

  4. x 等于 sourcex 属性。

  5. y 等于 sourcey 属性。

  6. 从与 sourcepressed 属性对应的集合中 移除 button,并令 buttons 为该 属性所得的值。

  7. browsing context执行实现特定的操作分派步骤, 等价于释放 pointerId 等于 input source 的 pointerId、 类型为 pointerType 的指针上编号为 button 的按钮, 该指针位于视口 x 坐标 x、 视口 y 坐标 y,并按下 buttons 按钮, 且符合 [UI-EVENTS] 和 [POINTER-EVENTS] 的要求。生成的事件必须 将 ctrlKeyshiftKeyaltKeymetaKey 设置为 global key state 中对应项的值。未通过 webdriver API 暴露的指针类型特定属性必须设置为 不支持该属性的硬件所指定的默认值。

  8. 返回成功,其数据为 null

为了给定 action objectsourceglobal key statetick durationbrowsing contextactions options分派 pointerMove 操作

  1. x offset 等于 action objectx 属性。

  2. y offset 等于 action objecty 属性。

  3. origin 等于 action objectorigin 属性。

  4. 令 (x, y) 为使用 sourcex offsety offsetoriginbrowsing contextactions options trying获取 相对于原点的坐标的结果。

  5. 如果 x 小于 0 或大于以 CSS 像素表示的视口宽度,则返回错误,其 错误码为 move target out of bounds

  6. 如果 y 小于 0 或大于以 CSS 像素表示的视口高度,则 返回错误,其错误码为 move target out of bounds

  7. 如果 action objectduration 属性 不是 undefined,则令 duration 等于它; 否则令 duration 等于 tick duration

  8. 如果 duration 大于 0 且处于任何 实现定义的边界内,则异步等待一段 实现定义的时间经过。

  9. width 等于 action objectwidth 属性。

  10. height 等于 action objectheight 属性。

  11. pressure 等于 action objectpressure 属性。

  12. tangentialPressure 等于 action objecttangentialPressure 属性。

  13. tiltX 等于 action objecttiltX 属性。

  14. tiltY 等于 action objecttiltY 属性。

  15. twist 等于 action objecttwist 属性。

  16. altitudeAngle 等于 action objectaltitudeAngle 属性。

  17. azimuthAngle 等于 action objectazimuthAngle 属性。

  18. 使用参数 sourceglobal key statedurationstart xstart yxywidthheightpressuretangentialPressuretiltXtiltYtwistaltitudeAngleazimuthAngle 执行 pointer move

  19. 返回成功,其数据为 null

为了给定 sourceglobal key statedurationstart xstart ytarget xtarget ywidthheightpressuretangentialPressuretiltXtiltYtwistaltitudeAngleazimuthAngle执行 pointer move

  1. time delta 为自当前 tick 开始以来的时间,以单调时钟上的毫秒数度量。

  2. 如果 duration 大于 0,则令 duration ratiotime deltaduration 的比值; 否则为 1。

  3. 如果 duration ratio 为 1,或者足够接近 1 以至于 实现不会进一步细分 move 操作, 则令 last 为 true。否则令 lastfalse

  4. 如果 last 为 true,则令 x 等于 target xy 等于 target y

    否则令 x 等于 duration ratio × (target x - start x) + start x 的近似值,并令 y 等于 duration ratio × (target y - start y) + start y 的近似值。

  5. current x 等于 input statex 属性。

  6. current y 等于 input statey 属性。

  7. 如果 x 不等于 current xy 不等于 current y,则运行以下步骤:

    1. buttons 等于 input state 的 buttons 属性。

    2. browsing context执行 实现特定的操作分派步骤, 等价于移动 pointerId 等于 input source 的 pointerId、 类型为 pointerType 的指针,从视口 x 坐标 current x、视口 y 坐标 current y 移动到视口 x 坐标 x 和视口 y 坐标 y,具有 widthheightpressuretangentialPressuretiltXtiltYtwistaltitudeAngleazimuthAngle,并按下 buttons 按钮,且符合 [UI-EVENTS] 和 [POINTER-EVENTS] 的要求。生成的 事件必须将 ctrlKeyshiftKeyaltKeymetaKey 设置为 global key state 中对应项的值。未通过 WebDriver API 暴露的指针类型特定属性必须设置为 不支持该属性的硬件所指定的默认值。在 pointerType 为 "pen" 或 "touch" 且 buttons 为空的情况下,这可能是 no-op。对于类型为 "mouse" 的指针,这将 始终产生至少包含 一个 pointerMove 事件在内的事件。

    3. input statex 属性 等于 x,并令 y 属性 等于 y

  8. 如果 last 为 true,则返回。

  9. 并行运行以下子步骤:

    1. 异步等待一段 实现定义的时间经过。

    2. 使用参数 input statedurationstart xstart ytarget xtarget y 执行 pointer move

为了给定 action objectsourceglobal key statetick durationbrowsing contextactions options分派 pointerCancel 操作

  1. browsing context执行 实现特定的操作分派步骤, 等价于取消 pointerId 等于 source 的 pointerId 项、类型为 pointerType 的指针的任何操作, 且符合 [UI-EVENTS] 和 [POINTER-EVENTS] 的要求。

  2. 返回成功,其数据为 null

15.6.4 滚轮操作

为了给定 action objectsourceglobal key statetick durationbrowsing contextactions options分派 scroll 操作

  1. x offset 等于 action objectx 属性。

  2. y offset 等于 action objecty 属性。

  3. origin 等于 action objectorigin 属性。

  4. 令 (x, y) 为使用 sourcex offsety offsetoriginbrowsing contextactions options trying获取 相对于原点的坐标的结果。

  5. 如果 x 小于 0 或大于以 CSS 像素表示的视口宽度,则 返回错误,其错误码为 move target out of bounds

  6. 如果 y 小于 0 或大于以 CSS 像素表示的视口高度,则 返回错误,其错误码为 move target out of bounds

  7. delta x 等于 action objectdeltaX 属性。

  8. delta y 等于 action objectdeltaY 属性。

  9. 如果 action objectduration 属性 不是 undefined,则令 duration 等于它; 否则令 duration 等于 tick duration

  10. 如果 duration 大于 0 且处于任何 实现定义的边界内,则异步等待一段 实现定义的时间经过。

  11. 使用参数 global key statedurationxydelta xdelta y00 执行 scroll

  12. 返回成功,其数据为 null

为了给定 durationxytarget delta xtarget delta ycurrent delta xcurrent delta y执行 scroll

  1. time delta 为自当前 tick 开始以来的时间,以单调时钟上的毫秒数度量。

  2. 如果 duration 大于 0,则令 duration ratiotime deltaduration 的比值; 否则为 1。

  3. 如果 duration ratio 为 1,或者足够接近 1 以至于 实现不会进一步细分 move 操作, 则令 last 为 true。否则令 lastfalse

  4. 如果 last 为 true,则令 delta x 等于 target delta x - current delta x,并令 delta y 等于 target delta y - current delta y

    否则令 delta x 等于 duration ratio × target delta x - current delta x 的近似值, 并令 delta y 等于 duration ratio × target delta y - current delta y 的近似值。

  5. 如果 delta x 不等于 0delta y 不等于 0, 则运行以下步骤:

    1. browsing context执行 实现特定的操作分派步骤, 等价于在视口 x 坐标 x、视口 y 坐标 y 处进行滚轮滚动,deltaX 值为 delta x,deltaY 值为 delta y, 且符合 [UI-EVENTS] 的要求。生成的事件必须 将 ctrlKeyshiftKeyaltKeymetaKey 设置为 global key state 中对应项的值。

    2. current delta x 属性 等于 delta x + current delta x,并令 current delta y 属性等于 delta y + current delta y

  6. 如果 last 为 true,则返回。

  7. 并行运行以下子步骤:

    1. 异步等待一段 实现定义的时间经过。

    2. 使用参数 durationxytarget delta xtarget delta ycurrent delta xcurrent delta y 执行 scroll

15.7 执行操作

HTTP 方法 URI 模板
POST /session/{session id}/actions

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回 错误,其错误码no such window

  2. Try 使用 session 处理任何用户提示

  3. input state 为使用 sessionsession当前顶级浏览 上下文 获取输入 状态的结果。

  4. actions options 为一个新的操作选项, 其是元素原点步骤设置为表示 web 元素,且获取元素原点步骤设置 为获取 WebElement 原点

  5. actions by tick 为使用 input stateparametersactions options trying提取操作序列的结果。

  6. 使用 input stateactions by tick当前浏览 上下文actions options 分派操作。如果这产生错误, 则返回该错误。

  7. 返回成功,其数据为 null

15.8 释放操作

HTTP 方法 URI 模板
DELETE /session/{session id}/actions

释放操作命令 用于释放当前被按下的所有按键和指针按钮。 这会使事件被触发, 就好像该状态是通过一系列显式操作释放的一样。 它还会清除虚拟设备的所有内部状态。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文 不再打开,则返回 错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. input state 为使用session当前顶级浏览 上下文 获取输入状态 的结果。

  4. actions options 为一个新的操作选项, 其是元素原点步骤设置为表示 web 元素,且获取元素原点步骤设置 为获取 WebElement 原点

  5. 使用 input state 等待操作队列令牌

  6. undo actionsinput state输入取消列表的逆序。

  7. Try 使用 input stateundo actions当前浏览 上下文actions options 分派操作

  8. 使用 sessionsession当前 顶级浏览上下文 重置输入状态

  9. 返回成功,其数据为 null

16. 用户提示

本章描述与各种类型的用户 提示的交互。用户提示的共同点是: 它们都是模态窗口,需要用户先与其交互, 事件 循环才会取消暂停,并将控制权返回给 session当前顶级浏览 上下文

默认情况下,用户提示不会被自动处理, 除非定义了用户提示处理程序。 当用户提示出现时, 后续命令负责处理它。 如果后续请求的命令不是本章列出的命令之一, 则会返回 unexpected alert open 错误

只要活动会话是一个只包含一个 项的列表,并且该项是 HTTP 会话,但不是 BiDi 会话,则在触发 beforeunload 的步骤中, 实现必须表现得好像显示 unload 提示很可能会 令人厌烦、具有欺骗性或没有意义。

这意味着当存在活动的仅 HTTP 会话时, beforeunload 提示永远不会显示。

用户 提示有关联的用户提示消息, 它是显示给用户的字符串消息; 如果消息长度为 0,则为 null

为了给定 browsing context:获取活动 用户提示

  1. agentbrowsing context活动 文档相关代理

  2. 如果 agent事件循环当前 未暂停,则返回 null。

  3. 返回用于处理满足 event loop暂停时传入条件所需输入的用户提示

当前用户 提示是以当前浏览上下文 获取活动 用户提示的结果。

dismiss 一个用户 提示,则表现得好像用户点击了该提示上的 Cancel 按钮; 如果不存在该按钮,则改为accept 该提示。

accept 一个用户 提示,则表现得好像用户点击了该提示上的 OK 按钮。

16.1 用户提示处理程序

远程端具有一个用户提示处理程序, 它定义当用户提示被显示时 WebDriver 会话将如何响应。 它要么为 null,要么为字符串和 提示处理程序配置值之间的映射。 初始时它为 null。

提示处理程序配置是一个有两个 项的结构体; 一个是 handler,它是一个 字符串;另一个是 notify, 它是一个布尔值。

为了给定 configuration序列化提示处理程序配置

  1. serializedconfigurationhandler

  2. 如果 «"dismiss", "accept包含 serialized, 且 configurationnotify 为 true,则将 " and notify" 追加到 serialized

  3. 返回 serialized

已知提示 处理程序为:
Handler key 描述(非规范性)。
"dismiss" 遇到的所有简单对话框都应被dismissed
"accept" 遇到的所有简单对话框都应被accepted
"dismiss and notify" 遇到的所有简单对话框都应被dismissed, 并返回一个错误以表明该对话框已被处理。
"accept and notify" 遇到的所有简单对话框都应被accepted, 并返回一个错误以表明该对话框已被处理。
"ignore" 遇到的所有简单对话框都应留给用户处理。

有效提示 类型为 «"alert", "beforeUnload", "confirm", "default", "file", "prompt"»。

"default" 类型表示当没有为给定提示类型定义 特定处理程序时的后备,包括 "beforeUnload" 提示类型。只有在 unhandled prompt behavior 是一个映射并且 包含 "default" 时,才能设置它。 对于将 unhandled prompt behavior 设置为字符串值的仅 HTTP 会话,该值会被赋给内部类型 "fallbackDefault"。 "fallbackDefault" 值不会用于 "beforeUnload" 提示类型,而是回退到 "accept" 处理程序。这是因为仅 HTTP 会话不 允许自定义 "beforeUnload" 处理程序,并且启用 其他协议不应作为副作用改变用户提示处理。

"file" 提示类型只在 [WebDriver-BiDi] 会话中被尊重。

为了给定参数 value反序列化为 unhandled prompt behavior

  1. value 设置为使用 value 将 JSON 派生的 JavaScript 值转换为 Infra 值的结果。

  2. 如果 value 不是字符串,则不同时支持 [WebDriver-BiDi] 的实现可以返回 错误, 其错误码invalid argument

    这是为了避免 [WebDriver-BiDi] monkey-patching 当前规范。

  3. is string value 为 false。

  4. 如果 value字符串,则将 value 设置为 映射 «["fallbackDefault" → value]»,并将 is string value 设置为 true。

  5. 如果 value 不是映射, 则返回 错误,其错误码invalid argument

  6. user prompt handler 为空映射
  7. 对于 value 中的每个 prompt typehandler

    1. 如果 is string value 为 false,且有效 提示 类型包含 prompt type, 则返回 错误,其错误 码invalid argument

    2. 如果已知提示处理程序不包含 handler keyhandler 的条目, 则返回 错误, 其错误码invalid argument

    3. notify 为 false。

    4. 如果 handler 是 "accept and notify", 则将 handler 设置为 "accept" 并将 notify 设置为 true。

    5. 如果 handler 是 "dismiss and notify", 则将 handler 设置为 "dismiss" 并将 notify 设置为 true。

    6. 如果 handler 是 "ignore", 则将 notify 设置为 true。

    7. configuration 为一个提示处理程序 配置,其handlerhandlernotifynotify

    8. 设置 user prompt handler[prompt type] 为 configuration

  8. 返回成功,其数据为 user prompt handler

为了给定 requested prompt handler检查用户提示处理程序匹配

  1. 如果用户提示处理程序为 null,则返回 true。

  2. 对于 requested prompt handler 中的每个 request prompt typerequest handler

    1. 如果用户提示处理程序 包含 request prompt type

      1. 如果 requested prompt handlerhandler 不等于用户 提示处理程序handler,则返回 false。

  3. 返回 true

这不会检查 requested prompt handlernotify 是否与 handler 匹配,因为 notify 组件只会 影响HTTP 会话(如果有)。

为了给定 requested prompt handler更新用户提示处理程序

  1. 如果用户提示处理程序为 null,则将用户提示 处理程序设置为空映射。

  2. 对于 requested prompt handler 中的每个 request prompt typerequest handler

    1. user prompt handler[request prompt type] 设置为 request handler

序列化用户提示处理程序

  1. 如果用户提示处理程序为 null,则返回 "dismiss and notify"。

  2. 如果用户提示处理程序大小为 1, 且用户提示处理程序包含 "fallbackDefault",则返回以 user prompt handler["fallbackDefault"] 调用序列化提示 处理程序配置的结果。

  3. serialized 为空映射

  4. 对于用户提示 处理程序中的每个 keyvalue

    1. serialized[key] 设置为以 value 调用序列化提示 处理程序配置的结果。

  5. 返回以 serialized 调用 将 Infra 值转换为 JSON 兼容的 JavaScript 值的结果。

带注解的 unexpected alert open 错误 是一个错误, 其错误码unexpected alert open, 并且带有可选的错误数据字典, 其具有以下条目:

"text"
当前用户提示消息

为了获取 type提示处理程序

  1. 如果用户提示处理程序为 null, 则令 handlers 为空映射。否则 令 handlers用户提示处理程序

  2. 如果 handlers 包含 type, 则返回 handlers[type]。

  3. 如果 handlers 包含 "default", 则返回 handlers["default"]。

  4. 如果 type 是 "beforeUnload",则返回一个 提示处理程序配置,其handler 为 "accept", notify 为 false。

  5. 如果 handlers 包含 "fallbackDefault", 则返回 handlers["fallbackDefault"]。

  6. 返回一个提示处理程序 配置,其handler 为 "dismiss",notify 为 true。

处理 任何用户提示

  1. 如果当前浏览上下文未被 对话框阻塞,则返回成功

  2. type 为 "default"。

  3. 如果当前用户提示是 alert 对话框, 则将 type 设置为 "alert"。否则,如果 当前用户提示是 beforeunload 对话框, 则将 type 设置为 "beforeUnload"。否则,如果 当前用户提示是 confirm 对话框, 则将 type 设置为 "confirm"。否则,如果 当前用户提示是 prompt 对话框, 则将 type 设置为 "prompt"。

  4. handler 为以 type 调用获取提示处理程序 的结果。

  5. 根据 handlerhandler 执行以下子步骤:

    "accept"

    Accept 当前用户提示

    "dismiss"

    Dismiss 当前用户提示

    "ignore"

    不执行任何操作。

  6. 如果 handlernotify 为 true,则返回带注解的 unexpected alert open 错误

  7. 返回成功

16.2 Dismiss Alert

HTTP 方法 URI 模板
POST /session/{session id}/alert/dismiss

Dismiss Alert 命令 会在存在简单对话框dismisses 它。 对 alert 用户提示dismiss 请求, 其不一定具有 dismiss 按钮, 与accepting 它具有相同效果。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前 顶级浏览 上下文不再打开,则返回错误, 其错误码no such window

  2. 如果当前用户提示为 null, 则返回错误,其错误码no such alert

  3. Dismiss 当前 用户提示

  4. 返回成功,其数据为 null

16.3 Accept Alert

HTTP 方法 URI 模板
POST /session/{session id}/alert/accept

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前 顶级浏览 上下文不再打开,则返回错误, 其错误码no such window

  2. 如果当前用户提示为 null, 则返回错误,其错误码no such alert

  3. Accept 当前 用户提示

  4. 返回成功,其数据为 null

16.4 获取 Alert 文本

HTTP 方法 URI 模板
GET /session/{session id}/alert/text

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前 顶级浏览 上下文不再打开,则返回错误, 其错误码no such window

  2. 如果当前用户提示为 null, 则返回错误,其错误码no such alert

  3. message 为与当前用户提示关联的文本消息; 否则为 null

  4. 返回成功,其数据为 message

16.5 发送 Alert 文本

HTTP 方法 URI 模板
POST /session/{session id}/alert/text

发送 Alert 文本命令window.prompt 用户提示的文本字段设置为给定值。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. text 为从 parameters 获取属性 "text" 的结果。

  2. 如果 text 不是String, 则返回错误,其错误码invalid argument

  3. 如果 session当前 顶级浏览 上下文不再打开,则返回错误, 其错误码no such window

  4. 如果当前用户提示为 null, 则返回错误,其错误码no such alert

  5. 运行创建当前 用户 提示的 API 的子步骤:

    window.alert
    window.confirm

    返回错误,其 错误码element not interactable

    window.prompt

    不执行任何操作。

    否则

    返回错误,其 错误码unsupported operation

  6. 执行依赖用户代理的步骤, 将当前用户提示的文本字段的值 设置为 text

  7. 返回成功,其数据为 null

17. 屏幕捕获

屏幕截图是一种用于提供 附加可视诊断信息的机制。 它们的工作方式是将可视视口的 framebuffer 的快照转储为无损 PNG 图像。 它会作为 Base64 编码字符串返回给本地端

WebDriver 提供 Take Screenshot 命令 来捕获顶级浏览上下文可视视口, 并提供一个命令 Take Element Screenshot, 用于在一个元素滚动到视图中后,对其 边界矩形的可见区域执行相同操作。

为了在给定一个矩形时, 从 framebuffer 绘制边界框

  1. 如果可视视口的宽度或高度任一 为 0 CSS 像素, 则返回错误,其错误码unable to capture screen

  2. paint width可视视口的宽度 – min(rectangle x 坐标, rectangle x 坐标 + rectangle 宽度 尺寸)。

  3. paint height可视视口的高度 – min(rectangle y 坐标, rectangle y 坐标 + rectangle 高度 尺寸)。

  4. canvas 为一个新的 canvas 元素, 并将其 widthheight 分别设置为 paint widthpaint height

  5. context(一个canvas context mode) 为以 canvas 作为目标调用 2D context creation algorithm 的结果。

  6. 完成实现特定的步骤,等价于 将由以下坐标指定的 framebuffer 区域 绘制到 context 上:

    X 坐标
    rectangle x 坐标
    Y 坐标
    rectangle y 坐标
    宽度
    paint width
    高度
    paint height
  7. 返回成功,其数据为 canvas

canvas 元素编码为 Base64

  1. 如果 canvas 元素的位图的 origin-clean 标志被设置为 false, 则返回错误,其错误码unable to capture screen

  2. 如果 canvas 元素的位图 没有像素(即其水平尺寸或垂直尺寸任一为零), 则返回错误,其错误码unable to capture screen

  3. filecanvas 元素的位图序列化为文件的结果, 并使用 "image/png" 作为参数。

  4. data URL 为表示 filedata: URL。 [RFC2397]

  5. indexdata URL 中 "," 的索引

  6. encoded stringdata URL 的一个子字符串, 其中使用 (index + 1) 作为 start 参数。

  7. 返回成功,其数据为 encoded string

17.1 Take Screenshot

HTTP 方法 URI 模板
GET /session/{session id}/screenshot

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前 顶级浏览 上下文不再打开,则返回错误, 其错误码no such window

  2. 当用户代理下一次将要运行动画帧回调时:

    1. root rectsession当前 顶级浏览上下文文档元素矩形

    2. screenshot result 为以 root rect 作为参数,trying 调用 从 framebuffer 绘制边界框 的结果。

    3. canvasscreenshot result 的 data 的 canvas 元素。

    4. encoding resulttryingcanvas 调用 将 canvas 编码为 Base64 的结果。

    5. encoded stringencoding result 的 data。

  3. 返回成功,其数据为 encoded string

17.2 Take Element Screenshot

HTTP 方法 URI 模板
GET /session/{session id}/element/{element id}/screenshot

Take Element Screenshot 命令 会截取由一个元素边界矩形 所包含的可见区域的屏幕截图。

给定 sessionURL variablesparameters 时,远程端步骤为:

  1. 如果 session当前浏览 上下文不再打开,则返回错误,其错误 码no such window

  2. Try 使用 session 处理任何用户提示

  3. element 为使用 sessionURL variables["element id"] trying获取已知元素的结果。

  4. element 滚动到视图中

  5. 当用户代理下一次将要运行动画帧回调时:

    1. element rectelement矩形

    2. screenshot result 为 以 element rect 作为参数 trying 调用 从 framebuffer 绘制边界框 的结果。

    3. canvasscreenshot result 的 data 的 canvas 元素。

    4. encoding resulttryingcanvas 调用 将 canvas 编码为 Base64 的结果。

    5. encoded stringencoding result 的 data。

  6. 返回成功,其数据为 encoded string

18. 打印

打印功能是一种将文档渲染为 分页格式的机制。它会作为包含分页 文档 PDF 表示的 Base64 编码字符串返回给本地端

当要求以参数 pageRangestotalPages 解析页面范围时,实现必须:

  1. pages 为空集合
  2. 对于 pageRanges 中的每个 range,运行 以下步骤:
    1. 如果 range 既不是Number 也不是 String,则返回错误,其错误 码invalid argument
    2. 如果 rangeNumber

      1. 如果 range 不是整数或小于 0, 则返回错误,其错误 码invalid argument
      2. range 追加到 pages

      否则:

      1. rangeParts 为在 "-" 字符上拆分 range 的结果。
      2. 如果 rangeParts 少于 1 个或多于 2 个 元素,则返回错误,其错误 码invalid argument
      3. 如果 rangeParts 有一个元素,则将对 rangeParts 的第一个元素 trying解析为整数的结果 追加到 pages

        否则:

        1. 如果 rangeParts 的第一个元素 等价于空 字符串, 则令 lowerBound1。否则 令 lowerBound 为对 rangeParts 的第一个元素 trying解析为整数的结果。
        2. 如果 rangeParts 的第二个元素 等价于空 字符串 则令 upperBoundtotalPages。否则 令 upperBound 为对 rangeParts 的第二个元素 trying解析为整数的结果。
        3. 如果 lowerBound 大于 upperBound,则返回错误, 其错误码invalid argument
        4. 将从 lowerBoundupperBound 的闭区间中的所有整数 追加到 pages
    3. 返回成功,其数据为 pages

如果一个String 在移除所有空白字符后 长度为零,则它等价于空字符串

当要求以参数 input 解析为整数时, 实现必须:

  1. stripped 为从 input 中剥离所有前导 和尾随空白字符的结果。
  2. 如果 stripped 长度为零,则返回错误,其 状态为 invalid argument
  3. 如果 stripped 包含范围 U+0030 - U+0039(即 0 - 9) 之外的任何字符,则返回错误,其状态为 invalid argument
  4. output 为以字符串 stripped 和基数 10 调用 parseInt 的结果。
  5. 返回成功,其数据为 output

19. 附录

本节是非规范性的。

19.1 外部规范

该列表并不详尽,且可能不是最新的。

以下外部规范定义了附加的 WebDriver 模块:

  1. Compute Pressure
  2. Custom Scheme Handlers
  3. Device Posture API
  4. Federated Credential Management API
  5. Generic Sensor API
  6. Global Privacy Control
  7. Permissions
  8. Reporting API
  9. Secure Payment Confirmation
  10. Storage Access API
  11. Web Authentication

A. 隐私

建议远程端创建新会话时创建新的配置文件。 这可以防止潜在敏感的会话数据 被新的会话访问, 从而确保隐私,并防止状态泄漏到下一个会话。

B. 安全

用户代理可以依赖命令行标志 或配置选项 来测试是否启用 WebDriver, 或者在用户代理没有 直接实现 HTTP 端点的情况下, 让用户代理通过 特权内容文档或控制小部件发起 或确认连接。

强烈建议用户代理 要求用户采取显式操作来启用 WebDriver, 并且在面向公众使用的用户代理版本中 保持禁用 WebDriver。

为了防止网络上的任意机器 连接并创建会话, 建议默认只允许来自 环回设备的连接。

远程端可以包含 一个配置选项,用于限制 允许连接并发出请求的可接受 IP 范围。 此项的默认设置可能是 将连接限制为 IPv4 localhost CIDR 范围 127.0.0.0/8 以及 IPv6 localhost 地址 ::1。[RFC4632]

还建议用户代理 努力从视觉上区分 受 WebDriver 控制的用户代理会话 与用于正常浏览的会话。 这可以通过浏览器 chrome 元素实现, 例如“door hanger”、 对 OS 窗口进行彩色装饰, 或者在窗口中显著存在的某些小部件元素, 以便容易识别自动化窗口。

C. 元素显示性

尽管 WebDriver 没有定义用于 确定一个元素视口中可见性的原语, 但我们承认它对许多用户而言是一个重要功能。 这里我们包含一种推荐方法, 它会给出一个元素可见性的 简化近似, 但请注意,它只依赖树遍历, 并且只覆盖可见性检查的一个子集。

一个元素的可见性 由人眼在感知上可见的内容所指导。 在此上下文中,一个元素的显示性 与 visibilitydisplay 样式属性无关。

推荐实现者用来确定 一个元素可见性的方法最初由 Selenium 项目开发,并且 基于关于一个元素性质及其在树中 关系的粗略近似。一般而言,一个元素如果有任何部分绘制在 视口边界内的 canvas 上,就应被视为可见。

元素 显示状态是一个布尔值,表示 元素当前是否可见。

要使用 bot.dom.isShown Selenium atoms 获取元素显示状态, 给定 element

  1. functionbot.dom.isShown 函数。

  2. result 为以参数 null 和 element 调用 function[[Call]] 内部方法的结果。如果这引发异常,则返回 一个错误,其错误码unknown error

  3. 返回成功,其数据为 result

    元素显示状态通常作为 GET 请求的端点暴露,其 URI 模板/session/{session id}/element/{element id}/displayed

D. 致谢

多年来,有许多人帮助使 浏览器自动化成为可能, 并由此推进了本标准的目标。 特别感谢 Selenium 开源社区, 如果没有它,本标准就绝不可能成为现实。

本标准由以下人员创作: Aleksey Chemakin, Andreas Tolfsen, Andrey Botalov, Brian Burg, Christian Bromann, Clayton Martin, Daniel Wagner-Hall, David Burns, Dominique Hazael-Massieux, Eran Messeri, Erik Wilde, Gábor Csárdi, Henrik Skupin, James Graham, Jason Juang, Jason Leyba, Jim Evans, John Chen, John Jansen, Jonathan Lipps, Jonathon Kereliuk, Luke Inman-Semerau, Maja Frydrychowicz, Malini Das, Manoj Kumar, Marc Fisher, Mike Pennisi, Ondřej Machulda, Randall Kent, Sam Sneddon, Seva Lotoshnikov, Simon Stewart, Sri Harsha, Titus Fortner, and Vangelis Katsikaros. 该工作由 David BurnsSimon Stewart 协调并编辑。

感谢 Berge Schwebs Bjørlo, Lukas Tetzlaff, Malcolm Rowe, Michael[tm] Smith, Nathan Bloomfield, Philippe Le Hégaret, Robin Berjon, Ross Patterson, and Wilhelm Joys Andersen 进行校对并提出改进建议。

E. 索引

本规范依赖若干其他底层规范。

ARIA 及相关规范

以下术语定义于 Accessible Rich Internet Applications (WAI-ARIA) 1.2 规范中:[wai-aria-1.2]

以下术语定义于 Accessible Name and Description Computation 1.1 规范中:[accname-1.1]

Web App Security

以下术语定义于 Content Security Policy Level 3 规范中:[CSP3]

Base16、Base32 和 Base64 数据编码

以下术语定义于 The Base16, Base32, and Base64 Data Encodings 规范中:[RFC4648]

DOM

以下术语定义于 DOM Parsing and Serialization 规范中:[DOM-PARSING]

以下属性定义于 UI Events 规范中:[UI-EVENTS]

以下属性定义于 UI Events Code 规范中:[UIEVENTS-KEY]

ECMAScript

以下术语定义于 ECMAScript 语言规范中:[ECMA-262]

本规范还假定你能够调用 ECMAScript 语言规范中的某些内部方法 [ECMAScript]:
ECMAScript 语言规范还定义了贯穿本 规范使用的以下类型、值和操作:
Encoding

以下术语定义于 WHATWG Encoding 规范中:[ENCODING]

Fetch

以下术语定义于 WHATWG Fetch 规范中:[FETCH]

Fullscreen

以下术语定义于 WHATWG Fullscreen 规范中:[FULLSCREEN]

HTML

以下术语定义于 HTML 规范中:[HTML]

HTML 规范还定义了 input 元素的状态

HTML 规范还定义了一系列不同的属性:

HTML Editing APIs 规范定义了以下术语:[EDITING]

以下事件也定义于 HTML 规范中:

“data” URL 方案规范定义了以下术语:[RFC2397]

HTTP 及相关规范

若要 符合 HTTP, 则假定实现支持 [RFC7230]、 [RFC7231]、 [RFC7232]、 [RFC7234] 和 [RFC7235] 的相关子集。

以下术语定义于 Cookie 规范中:[RFC6265]

以下术语定义于 Same Site Cookie 规范中:[RFC6265bis]

以下术语定义于 Hypertext Transfer Protocol (HTTP) Status Code Registry:

Infra

以下术语定义于 Infra 规范中:[INFRA]

以下术语定义于 Netscape Navigator Proxy Auto-Config File Format:

本规范使用 URI 模板。[URI-TEMPLATE]

Interaction
以下术语定义于 Page Visibility Specification [PAGE-VISIBILITY]
Selenium
以下函数定义于 Selenium 项目中,位于 revision 775cfb33b193eb8832cd5488f298006f45254685
Styling
以下术语定义于 CSS Values and Units Module Level 3 规范中:[CSS3-VALUES]
以下属性定义于 CSS Basic Box Model Level 3 规范中:[CSS3-BOX]
以下术语定义于 CSS Device Adaptation Module Level 1 规范中:[CSS-DEVICE-ADAPT]
以下属性定义于 CSS Display Module Level 3 规范中:[CSS3-DISPLAY]
以下术语定义于 Geometry Interfaces Module Level 1 规范中:[GEOMETRY-1]
以下术语定义于 CSS Cascading and Inheritance Level 4 规范中:[CSS-CASCADE-4]
以下术语定义于 CSS Object Model:[CSSOM]:
以下函数定义于 CSSOM View Module:[CSSOM-VIEW]:
以下术语定义于 [mediaqueries-4]:
SOCKS Proxy:

以下术语定义于该标准中:[RFC1928]

Unicode
以下术语定义于该标准中:[Unicode]
Unicode Standard Annex #29
以下术语定义于该标准中:[UAX29]
Unicode Standard Annex #44
以下术语定义于该标准中:[UAX44]
URL
以下术语定义于 WHATWG URL 标准中:[URL]
Web IDL

本规范中的 IDL 片段 必须按 Web IDL 规范中对符合性 IDL 片段所要求的方式解释。[WEBIDL]

Promises Guide

以下术语定义于 Promises Guide 中。[PROMISES-GUIDE]

XPATH

以下术语定义于 Document Object Model XPath 标准中 [XPATH]

E.1 本 规范定义的术语

E.2 由引用定义的术语

F. 参考文献

F.1 规范性引用

[accname-1.1]
无障碍名称和描述计算 1.1. Joanmarie Diggs; Bryan Garaventa; Michael Cooper. W3C. 2018 年 12 月 18 日. W3C 推荐标准. URL: https://www.w3.org/TR/accname-1.1/
[CSP3]
内容安全策略第 3 级. Mike West; Antonio Sartori. W3C. 2026 年 5 月 5 日. W3C 工作草案. URL: https://www.w3.org/TR/CSP3/
[CSS-CASCADE-4]
CSS 层叠与继承第 4 级. Elika Etemad; Tab Atkins Jr. W3C. 2022 年 1 月 13 日. W3C 候选 推荐标准. URL: https://www.w3.org/TR/css-cascade-4/
[CSS-DEVICE-ADAPT]
CSS 设备适配模块第 1 级. Rune Lillesveen; Florian Rivoal; Matt Rakow. W3C. 2016 年 3 月 29 日. W3C 工作 草案. URL: https://www.w3.org/TR/css-device-adapt-1/
[CSS21]
层叠样式表第 2 级修订版 1(CSS 2.1) 规范. Bert Bos; Tantek Çelik; Ian Hickson; Håkon Wium Lie. W3C. 2011 年 6 月 7 日. W3C 推荐标准. URL: https://www.w3.org/TR/CSS2/
[CSS3-BOX]
CSS 盒模型模块第 3 级. Elika Etemad. W3C. 2024 年 4 月 11 日. W3C 推荐标准. URL: https://www.w3.org/TR/css-box-3/
[CSS3-DISPLAY]
CSS 显示模块第 3 级. Elika Etemad; Tab Atkins Jr. W3C. 2023 年 3 月 30 日. W3C 候选推荐标准. URL: https://www.w3.org/TR/css-display-3/
[CSS3-VALUES]
CSS 值与单位模块第 3 级. Tab Atkins Jr.; Elika Etemad. W3C. 2024 年 3 月 22 日. CRD. URL: https://www.w3.org/TR/css-values-3/
[CSSOM]
CSS 对象模型(CSSOM). Daniel Glazman; Emilio Cobos Álvarez. W3C. 2021 年 8 月 26 日. W3C 工作草案. URL: https://www.w3.org/TR/cssom-1/
[CSSOM-VIEW]
CSSOM 视图模块. Simon Fraser; Emilio Cobos Álvarez. W3C. 2025 年 9 月 16 日. W3C 工作草案. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
DOM 标准. Anne van Kesteren. WHATWG. 现行标准. URL: https://dom.spec.whatwg.org/
[DOM-PARSING]
DOM 解析与序列化. Travis Leithead. W3C. 2016 年 5 月 17 日. W3C 工作草案. URL: https://www.w3.org/TR/DOM-Parsing/
[ECMA-262]
ECMAScript 语言规范. Ecma International. URL: https://tc39.es/ecma262/multipage/
[EDITING]
HTML 编辑 API. A. Gregor. W3C. URL: https://dvcs.w3.org/hg/editing/raw-file/tip/editing.html
[ENCODING]
编码标准. Anne van Kesteren. WHATWG. 现行标准. URL: https://encoding.spec.whatwg.org/
[FETCH]
Fetch 标准. Anne van Kesteren. WHATWG. 现行标准. URL: https://fetch.spec.whatwg.org/
[fileapi]
File API. Marijn Kruisselbrink. W3C. 2025 年 12 月 3 日. W3C 工作草案. URL: https://www.w3.org/TR/FileAPI/
[FULLSCREEN]
Fullscreen API 标准. Philip Jägenstedt. WHATWG. 现行标准. URL: https://fullscreen.spec.whatwg.org/
[GEOMETRY-1]
几何接口模块第 1 级. Sebastian Zartner; Yehonatan Daniv. W3C. 2025 年 12 月 4 日. CRD. URL: https://www.w3.org/TR/geometry-1/
[HTML]
HTML 标准. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 活 标准. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Infra 标准. Anne van Kesteren; Domenic Denicola. WHATWG. 现行标准. URL: https://infra.spec.whatwg.org/
[mediaqueries-4]
媒体查询第 4 级. Tab Atkins Jr.; Florian Rivoal. W3C. 2026 年 2 月 19 日. CRD. URL: https://www.w3.org/TR/mediaqueries-4/
[PAGE-VISIBILITY]
页面可见性(第二版). Jatinder Mann; Arvind Jain. W3C. 2013 年 10 月 29 日. W3C 推荐标准. URL: https://www.w3.org/TR/page-visibility/
[POINTER-EVENTS]
指针事件. Patrick Lauke; Robert Flack. W3C. 2026 年 2 月 25 日. W3C 工作草案. URL: https://www.w3.org/TR/pointerevents4/
[PROMISES-GUIDE]
编写使用 Promise 的 规范. Domenic Denicola. W3C. 2018 年 11 月 9 日. TAG 结论. URL: https://www.w3.org/2001/tag/doc/promises-guide
[RFC1928]
SOCKS 协议第 5 版. M. Leech; M. Ganis; Y. Lee; R. Kuris; D. Koblas; L. Jones. IETF. 1996 年 3 月. 提议标准. URL: https://www.rfc-editor.org/rfc/rfc1928
[RFC2397]
"data" URL 方案. L. Masinter. IETF. 1998 年 8 月. 提议标准. URL: https://www.rfc-editor.org/rfc/rfc2397
[RFC3514]
IPv4 标头中的安全 标志. S. Bellovin. IETF. 2003 年 4 月 1 日. 信息性. URL: https://www.rfc-editor.org/rfc/rfc3514
[RFC4122]
通用唯一标识符(UUID)URN 命名空间. P. Leach; M. Mealling; R. Salz. IETF. 2005 年 7 月. 提议标准. URL: https://www.rfc-editor.org/rfc/rfc4122
[RFC4632]
无类别域间路由(CIDR):Internet 地址分配与聚合计划. V. Fuller; T. Li. IETF. 2006 年 8 月. 当前最佳实践. URL: https://www.rfc-editor.org/rfc/rfc4632
[RFC4648]
Base16、Base32 和 Base64 数据 编码. S. Josefsson. IETF. 2006 年 10 月. 提议标准. URL: https://www.rfc-editor.org/rfc/rfc4648
[RFC6265]
HTTP 状态管理机制. A. Barth. IETF. 2011 年 4 月. 提议标准. URL: https://httpwg.org/specs/rfc6265.html
[RFC6265bis]
Cookies:HTTP 状态 管理机制. M. West; J. Wilander. IETF. 草案. URL: https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-05
[RFC7230]
超文本传输协议(HTTP/1.1): 消息语法与路由. R. Fielding, Ed.; J. Reschke, Ed. IETF. 2014 年 6 月. 提议标准. URL: https://httpwg.org/specs/rfc7230.html
[RFC7231]
超文本传输协议(HTTP/1.1): 语义与内容. R. Fielding, Ed.; J. Reschke, Ed. IETF. 2014 年 6 月. 提议标准. URL: https://httpwg.org/specs/rfc7231.html
[RFC7232]
超文本传输协议(HTTP/1.1): 条件请求. R. Fielding, Ed.; J. Reschke, Ed. IETF. 2014 年 6 月. 提议 标准. URL: https://httpwg.org/specs/rfc7232.html
[RFC7234]
超文本传输协议(HTTP/1.1): 缓存. R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. 2014 年 6 月. 提议标准. URL: https://httpwg.org/specs/rfc7234.html
[RFC7235]
超文本传输协议(HTTP/1.1): 认证. R. Fielding, Ed.; J. Reschke, Ed. IETF. 2014 年 6 月. 提议 标准. URL: https://httpwg.org/specs/rfc7235.html
[UAX29]
Unicode 文本 分段. Josh Hadley. Unicode Consortium. 2025 年 8 月 17 日. Unicode 标准 附录 #29. URL: https://www.unicode.org/reports/tr29/tr29-47.html
[UAX44]
Unicode 字符 数据库. Ken Whistler. Unicode Consortium. 2025 年 8 月 27 日. Unicode 标准 附录 #44. URL: https://www.unicode.org/reports/tr44/tr44-36.html
[UI-EVENTS]
UI 事件. Xiaoqian Wu. W3C. 2026 年 2 月 21 日. W3C 工作草案. URL: https://www.w3.org/TR/uievents/
[UIEVENTS-KEY]
UI Events KeyboardEvent key 值. Travis Leithead; Gary Kacmarcik. W3C. 2025 年 4 月 22 日. W3C 推荐标准. URL: https://www.w3.org/TR/uievents-key/
[Unicode]
Unicode 标准. Unicode Consortium. URL: https://www.unicode.org/versions/latest/
[URI-TEMPLATE]
URI 模板. J. Gregorio; R. Fielding; M. Hadley; M. Nottingham; D. Orchard. IETF. 2012 年 3 月. 提议标准. URL: https://www.rfc-editor.org/rfc/rfc6570
[URL]
URL 标准. Anne van Kesteren. WHATWG. 现行标准. URL: https://url.spec.whatwg.org/
[wai-aria-1.2]
无障碍富互联网应用(WAI-ARIA) 1.2. Joanmarie Diggs; James Nurthen; Michael Cooper; Carolyn MacLeod. W3C. 2023 年 6 月 6 日. W3C 推荐标准. URL: https://www.w3.org/TR/wai-aria-1.2/
[WebDriver-BiDi]
WebDriver BiDi. James Graham; Alex Rudenko; Maksim Sadym. W3C. 2026 年 3 月 19 日. W3C 工作草案. URL: https://www.w3.org/TR/webdriver-bidi/
[WEBIDL]
Web IDL 标准. Edgar Chen; Timothy Gu. WHATWG. 现行标准. URL: https://webidl.spec.whatwg.org/
[XPATH]
XML 路径语言(XPath)版本 1.0. James Clark; Steven DeRose. W3C. 1999 年 11 月 16 日. W3C 推荐标准. URL: https://www.w3.org/TR/xpath-10/