Marionette初识四----Protocol
1. Marionette 提供了一个面向用户的异步、并行流水线界面。 消息排序限制了有效载荷竞争条件的机会,并提供了一种有效载荷序列化的统一的方式。
2. 提供了阻塞 WebDriver 接口的客户端,使之不会在最后一个命令的响应返回之前发送进一步的命令请求,但如果碰巧因为编程错误而这样做,则不会造成任何损害。 这可以防止混淆响应。
消息流示意图:
client server | | msgid=1 |----------->| | command | | | msgid=2 |<-----------| | command | | | msgid=2 |----------->| | response | | | msgid=1 |<-----------| | response | | |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commend
1. 该协议由[命令]消息和相应的[响应]消息组成。 必须始终发送 [响应] 消息以回复 [命令] 消息。
这意味着服务器实现不需要按照收到命令的顺序精确发送回复:
如果服务器收到多条消息,服务器甚至可能以随机顺序回复。 因此,强烈建议客户端在实现此有线协议的客户端时考虑到这一点。 这是流水线消息所必需的。 在服务器端,有些功能很快,有些则不那么快。 如果服务器必须按顺序回复,即使它的执行已经完成,慢速函数也会延迟其他回复。
2. 协议的请求或命令消息有四要素,它可能来自客户端或服务器远程端:
[type, message ID, command, parameters]
type---必须是0(整数),表明该消息是一个[命令]。
message ID---是32位无符号整数,该编号用作唯一标识一对[命令]和[响应]消息的序列号。另一个远程部分将回复具有相同消息 ID 的相应 [响应]。
command---是标识 RPC 方法(要求执行命令)的字符串
parametes---是任意 JSON 可序列化的对象。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Response
1. 响应消息也是如下图所示的四元素数组,并且必须始终在接收到[命令]后发送
[type, message ID, error, result]
type---必须是 1(整数)。这表明该消息是 [response]
message ID---对应Command的message ID
error---如果命令正确执行,则为 null。如果错误发生在服务器端,那么这是一个 [error] 对象。
result---如果正确执行,它是执行 [command] 的结果对象。 如果服务器端发生错误,则该字段为空。
注意:result的结果字段可能各不相同,但对于每个command是单独记录的。
以下是一个错误的Response对象,错误对象是JavaScript 错误类型的序列化
{ "error": "invalid session id", "message": "No active session with ID 1234", "stacktrace": "" }
错误对象的所有字段都是必须的,所以message &&stacktrace可能是空,错误字段保证是 [WebDriver 标准] 规定的 JSON 错误代码之一。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Clients--客户端
客户端可以用任何能够通过 TCP 套接字写入和接收数据的语言来实现。客户端可以同步和异步实现,尽管后者在协议级别 2 和更早版本中是不可能的,因为缺少消息排序。