Selenium 简明教程
Selenium Grid - Architecture
Selenium Grid 被开发为一系列组件,每个组件执行自己的任务,以便 Selenium Grid 作为一个整体工作。各个组件的工作听起来可能有点复杂。最新版本的 Selenium Grid 4 是在不利用旧版本 Selenium Grid 的代码库的情况下开发的。
Components of Selenium Grid
Selenium Grid 的主要组件如下:
-
Event Bus - 事件总线用于传送可能在其他组件之间异步获取的消息。
-
Distributor - 分发器会跟踪 Selenium Grid 中的每个可访问资源,这些资源可用于启动会话(称为时段)并接受新的内部请求并为其提供时段。
-
Node - 节点用于执行 webdriver 会话。每个会话都会提供一个时段,一个节点可以拥有多个时段,也可以不拥有。
-
Session Map - 会话映射在会话 ID 和会话运行的节点位置之间保持关系。
-
New Session Queue - 新会话队列存储未分配到给定节点的传入会话列表。
-
Router - 路由器就像是 Selenium Grid 的门面,并暴露在网络中。路由器将传入请求定向到新会话队列或正在进行会话的节点。
-
Slot - 插槽是会话可以执行的位置。插槽应具备一些新会话请求应匹配的最低特征,以便分配器可以将该请求分派给具有插槽的节点。
-
Grid Model - 网格模型描述了分配器监视 Selenium Grid 性能的方式。
Communication Methods Among the Components
Selenium Grid 中组件之间的通信方法如下所示 -
-
通过 HTTP 请求的同步 JSON。
-
异步事件分派到事件总线。
在执行任务同步,或错失响应会很困难的情况下,会执行同步通信。然而,在仅进行信息广播或错失响应无所谓的情况下,将异步通信发送到事件总线。
Dependencies Among the Selenium Grid Components
任何 Selenium Grid 组件都可以按任何顺序启动,但理想情况下,组件按以下顺序启动 -
-
会话映射和事件总线首先启动。它们相互独立,可以同时工作。
-
接下来,会话队列开始。
-
接下来,分配器可以启动。它将定期连接到会话队列并轮询作业。可以按时间间隔或按事件进行轮询。
-
此时,路由器可以启动。新会话请求已发送至会话队列,并且分配器将尝试查找用于执行会话的插槽。
-
接下来,可以启动节点。完成节点注册后,Selenium Grid 可以处理流量。
Event Bus |
Distributor |
Node |
Router |
Session Map |
Session Queue |
|
Event Bus |
No |
|||||
Distributor |
Yes |
No |
Yes |
Yes |
||
Node |
Yes |
No |
||||
Router |
Yes |
No |
Yes |
|||
Session Map |
No |
|||||
Session Queue |
Yes |
No |
上表显示了组件之间的依赖关系,其中“是”表示组件之间存在同步依赖关系。
How is Node Registration Done in Selenium Grid?
节点注册的整个过程是轻量级的。当一个节点变为活动时,它应定期发布“心跳”事件。这表明了节点状态。
分配器会监听“心跳”事件。当它接收到“心跳”事件时,便会尝试 GET 节点的 /status 端点。该信息用于配置 Selenium Grid。分配器执行的此检查遵循有条不紊的方法。但是,即使节点已开始工作,节点也应该总是分发“心跳”事件。这么做是为了可以在没有任何 Selenium Grid 状态存储库的情况下恢复分配器。
Fields in a Node Status Object in Selenium Grid
节点状态接收为具有如下字段的 JSON 对象 -
Name |
Type |
Description |
availability |
string |
可以是三个字符串值之一——上升、下降和下落。最常见的是下降,它表示不应将新的会话导向节点,并且一旦该节点上的前一个会话完成,该节点应终止或重新启动。 |
externalUrl |
string |
Selenium Grid 中每个组件应联系的 Url。 |
lastSessionCreated |
integer |
节点上次会话的纪元时间戳。如果所有其他参数都相似,则分发器会尝试将新的会话导向最长时间未使用的节点。 |
maxSessionCount |
integer |
此整数值表示在将节点视为满之前,应该并行在节点上运行的最大会话数。 |
nodeId |
string |
用于标识此节点对象的 UUID。 |
osInfo |
object |
具有三个字段之一的对象——arch、name 和 version。GridUI 和 GraphQL 查询使用这些字段。 |
slots |
array |
Slot objects array |
version |
string |
The Node version |
在以上所有字段中设置值是一个好的做法。
Slot Objects in Selenium Grid
Slot 对象指向节点内的某个插槽。某个会话可以在插槽内运行。Slot 对象中的字段如下所列:
Name |
Type |
Description |
id |
string |
UUID 用于标识插槽。 |
lastStarted |
string |
这表示上一个会话以 ISO-8601 格式开始的时间。 |
stereotype |
object |
插槽应具有的最小功能组。例如:{"browserName": "chrome"} |
sessionObject |
object |
Indicates the Session object. |
Session Objects in Selenium Grid
会话对象用于引用插槽中的当前会话。会话对象中的字段如下所示:
Name |
Type |
Description |
capabilities |
object |
会话给出的正确特性。 |
startTime |
string |
这表示会话在 ISO-8601 格式中的开始时间。 |
stereotype |
object |
插槽应具有的最小功能组。例如:{"browserName": "chrome"} |
uri |
string |
与会话交互的节点 uri。 |
这结束了我们对 Selenium Grid 架构教程的全面讲解。我们从描述 Selenium Grid 的关键组件、这些组件之间的通信方法和依赖关系、如何进行节点注册、Selenium Grid 中的节点状态对象、插槽对象和会话对象中的字段开始。
这使你能够深入了解 Selenium Grid 架构。明智的做法是继续练习你学到的知识,并探索与 Selenium 相关的其他知识,以加深你的理解并拓展你的视野。