Marvin's Blog【程式人生】

Ability will never catch up with the demand for it

06 Aug 2020

读W3C的WebDriver笔记【一】

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

描述了对能力的处理流程。

(本篇完)

comments powered by Disqus