W3C WebDriver描述的是如何通过HTTP对浏览器进行自动化。
Abstract
如果把浏览器这些Web用户代理比作是电视,那么WebDriver就像是一个遥控器,可以让第三方程序(而不是真实的用户)远程遥控浏览器。更具体一点,WebDriver定义的是电视机和遥控器之间的交互协议。这个交互协议与具体的第三方程序无关。WebDriver的操作目标也是DOM。
Interface
NavigatorAutomationInformation.webdriver 返回webdriver-active flag 是否被设置
Nodes
定义了WebDriver的通信各方。Local end代表遥控方,Remote end代表受控方,两者之间可以有中间节点Intermediary node ,代表中间方。为了与中间方区别,还定义了Endpoint node 作为终点方。
受控方可以通过readiness state来指示是否还能接受新的连接。
Protocol
遥控命令是通过HTTP协议承载的。WebDriver定义了受控方可以通过HTTP接受什么样的命令。
Algorithms
对命令的响应是通过演算步骤(algorithm)给出的。演算有可能失败,可以有success和error两个结果。
Latest published version Latest editor’s draft:
Commands
WebDriver的协议是按照command来组织的。每个command通过HTTP request来发送。在收到command之后,服务端运行一系列的remote end steps。
Processing mode
数据传输的模型:本地通过一个连接来连接远程,这样远程可以读写字节。当一个连接建立的时候,远程必须执行下列步骤:
- 从连接中读满一个HTTP request的数据。如果无法读取完整的HTTP Request,则必须返回500,或者其他错误码。
- 匹配method和URL到具体的命令,并进行错误处理
- 从里面获取命令和命令参数,并验证session
- 对POST类型的request做特殊处理
- 执行command并返回结果,错误的情况需要返回一个错误码以及错误数据字典(包含error, message,stacktrace等信息)
- 在response里面需要包含如下信息:
- Content-Type: “application/json; charset=utf-8”
- Cache-Control: “no-cache”
- JSON必须序列化成UTF-8格式,然后数据存储在器value字段
Routing requests
每个远端必须有一个定义好的URL prefix,要么是undefined要么是一个绝对路径。一个例子是使用/wd
作为URL prefix,这样可以和域名上的其他服务区别开来。
Endpoints
这个章节列了一个表格,把Method/URI 映射到Command,比如:
- POST /session,New Session
- POST /session/{session id}/print, Print Page
Errors
错误使用的错误码是4xx或者5xx。错误的细节在JSON的正文中体现。错误信息包含:
- error
- message
- stacktrace
- 可选的data
一个例子:
{
"value": {
"error": "unexpected alert open",
"message": "",
"stacktrace": "",
"data": {
"text": "Message from window.alert"
}
}
}
章节中列举了一系列的错误码,比如:
- element click intercepted ,400 ,The Element Click command could not be completed because the element receiving the events is obscuring the element that was requested clicked.
6.7 Extensions
WebDriver允许自定义命令,也称为扩展命令。扩展命令也是由一个HTTP endpoint以及若干远端执行步骤构成,并且具有一个URI模板。为了避免不同厂商之间的扩展命令冲突,URI模板必须以厂商自定义的前缀开头。一个以ms/edge
为前缀的例子:/session/5d376174-36f0-11e5-9b9a-6bdf200a3f7f/ms/edge/context
。
WebDriver以外的规范或许会定义额外的能力(additional WebDriver capabilities)。额外的能力的名字中不能带有':'。厂商也可以提供自定义的能力,名字中必须带有:
。
Capabilities
WebDriver通过能力来告知实现所支持的特性。本地端可以通过提供一个能力列表来告知远程端。远程端也可以通过提供能力列表来告知一个会话所支持的特性。
此章中提供了一个所有实现都必须支持的能力列表。
7.1 Proxy
列举了和代理相关的配置。
7.2 Processing capabilities
描述了对能力的处理流程。
(本篇完)