协议

Marionette 提供了一个异步的、并行的流水线用户界面。消息排序限制了有效载荷竞争条件的可能性,并提供了一种统一的方式来序列化有效载荷。

提供阻塞式 WebDriver 接口的客户端仍然预期在最后一个命令的响应返回之前不发送进一步的命令请求,但是如果由于编程错误而仍然发生这种情况,也不会造成任何损害。这可以防止响应混淆

消息的示意图流程

        client      server
          |            |
msgid=1    |----------->|
          |  command   |
          |            |
msgid=2    |<-----------|
          |  command   |
          |            |
msgid=2    |----------->|
          |  response  |
          |            |
msgid=1    |<-----------|
          |  response  |
          |            |

该协议由一个 command 消息和相应的 response 消息组成。必须始终发送 response 消息以回复 command 消息。

这意味着服务器实现不需要完全按照接收命令的顺序发送回复:如果它接收多个消息,服务器甚至可以以随机顺序回复。因此,强烈建议客户端在实现此线协议的客户端端时考虑到这一点。

这是流水线消息所必需的。在服务器端,某些功能很快,而另一些则较慢。如果服务器必须按顺序回复,即使慢速功能的执行已完成,它也会延迟其他回复。

命令

请求或 command 消息是一个如下所示的包含四个元素的 JSON 数组,它可能源自客户端或服务器远程端

[type, message ID, command, parameters]
  • type 必须为 0(整数)。这表示该消息为 command

  • message ID 是一个 32 位无符号整数。此数字用作排序号,唯一地标识 commandresponse 消息对。另一个远程部分将使用相同的 message ID 回复相应的 response

  • command 是一个字符串,用于标识要执行的 RPC 方法或命令。

  • parameters 是一个任意 JSON 可序列化对象。

响应

响应消息也是一个如下所示的包含四个元素的数组,并且必须始终在收到 command 后发送

[type, message ID, error, result]
  • type 必须为 1(整数)。这表示该消息为 response

  • message ID 是一个 32 位无符号整数。这对应于 command 的 message ID。

  • error 如果命令正确执行,则为 null。如果服务器端发生错误,则为 [error] 对象。

  • result 如果命令正确执行,则为执行 command 的结果对象。如果服务器端发生错误,则此字段为 null。

result 字段的结构可能有所不同,但每个命令都有单独的文档说明。

错误对象

错误对象是 JavaScript 错误类型的序列化,其结构如下

{
  "error": "invalid session id",
  "message": "No active session with ID 1234",
  "stacktrace": ""
}

错误对象的所有字段都是必需的,因此 stacktrace 和 message 字段可能是空字符串。error 字段保证是 WebDriver 标准 中规定的 JSON 错误代码之一。

客户端

客户端可以用任何能够通过 TCP 套接字写入和接收数据的语言实现。提供了参考客户端。客户端既可以同步实现,也可以异步实现,尽管由于缺乏消息排序,在协议级别 2 及更早版本中后者是不可能的。