• Selenium Video Tutorials

Selenium Grid - 架构



Selenium Grid 被开发为一组组件,每个组件执行自己的任务,以便 Selenium Grid 作为一个单元工作。各个组件的工作方式可能听起来有点复杂。最新版本的 Selenium Grid 4 是在没有利用 Selenium Grid 旧版本代码库的情况下开发的。

Selenium Grid 的组件

Selenium Grid 的关键组件列在下面:

  • 事件总线 - 事件总线用于传送可能在其他组件之间异步获得的消息。

  • 分发器 - 分发器跟踪 Selenium Grid 中每个可访问的资源,这些资源可用于启动会话(称为插槽)并接收新的传入请求并为其分配插槽。

  • 节点 - 节点用于执行 webdriver 会话。每个会话都会被分配一个插槽,并且节点可以拥有多个插槽,也可以不拥有。

  • 会话映射 - 会话映射维护会话 ID 与会话正在运行的节点位置之间的关系。

  • 新会话队列 - 新会话队列存储传入会话的列表,这些会话没有分发器分配的节点。

  • 路由器 - 路由器就像 Selenium Grid 的门面,并公开到 Web。路由器将传入请求重定向到新会话队列或正在进行会话的节点。

  • 插槽 - 插槽是会话可以执行的位置。插槽应具有一些新会话请求应匹配的最低功能,以便分发器可以将该请求调度到具有插槽的节点。

  • 网格模型 - 网格模型描述了分发器如何监视 Selenium Grid 的性能。

组件之间的通信方法

Selenium Grid 中组件之间的通信方法列在下面:

  • 通过 HTTP 请求同步 JSON。

  • 异步事件分派到事件总线。

在正在执行的任务是同步的场景中,或者如果难以错放响应,则进行同步通信。但是,在仅广播信息的场景中,或者如果错放响应是可以的,则将异步通信发送到事件总线。

Selenium Grid 组件之间的依赖关系

任何 Selenium Grid 组件都可以以任何顺序开始,但理想情况下,组件以以下顺序启动:

  • 会话映射和事件总线首先开始。它们彼此独立,可以同时工作。

  • 接下来,会话队列参与。

  • 接下来,分发器可以进入画面。它将以一定间隔连接到会话队列并轮询作业。轮询可以以一定间隔或通过事件来完成。

  • 此时,可以启动路由器。新会话请求被发送到会话队列,分发器将尝试搜索一个插槽来执行会话。

  • 接下来,可以启动节点。节点注册完成后,Selenium Grid 可以处理流量。

事件总线 分发器 节点 路由器 会话映射 会话队列
事件总线
分发器
节点
路由器
会话映射
会话队列

上表显示了组件之间的依赖关系,其中“是”表示组件之间存在同步依赖关系。

Selenium Grid 中如何完成节点注册?

整个节点注册过程是一个轻量级过程。当节点变为活动状态时,它应该以一定间隔发布“心跳”事件。这提供了节点状态的指示。

分发器侦听“心跳”事件。当它接收到“心跳”事件时,它会尝试获取节点的 /status 端点。此信息用于配置 Selenium Grid。分发器执行的此检查以有条理的方式完成。但是,即使节点在开始工作后也应始终调度“心跳”事件。这样做是为了在没有 Selenium Grid 状态的一致存储的情况下,可以恢复分发器。

Selenium Grid 中节点状态对象中的字段

节点状态作为 JSON 对象接收,其中包含以下字段:

名称 类型 描述
可用性 字符串 可以是三个字符串值之一 - up、draining 和 down。最常见的是 draining,它表示不应该将新的会话定向到节点,并且一旦节点上的先前会话完成,节点将终止或重新启动。
外部 URL 字符串 Selenium Grid 中每个组件都应联系的 URL。
上次创建的会话 整数 节点上次会话的纪元时间戳。如果所有其他参数都相似,则分发器会尝试将新会话定向到最长时间未使用的节点。
最大会话数 整数 此整数值表示在被视为已满之前,应在节点上并行运行的最大会话数。
节点 ID 字符串 用于标识此节点对象的 UUID。
操作系统信息 对象 具有三个字段之一的对象 - arch、name 和 version。这些由 GridUI 和 GraphQL 查询使用。
插槽 数组 插槽对象数组
版本 字符串 节点版本

最好在所有上述字段中设置值。

Selenium Grid 中的插槽对象

插槽对象指向节点内的某个插槽。特定会话可以在插槽内运行。插槽对象中的字段列在下面:

名称 类型 描述
ID 字符串 UUID 用于标识插槽。
上次启动 字符串 这指示上次会话以 ISO-8601 格式开始的时间。
原型 对象 插槽应具有的最小功能组。例如:{"browserName": "chrome"}
会话对象 对象 指示会话对象。

Selenium Grid 中的会话对象

会话对象用于引用插槽内的当前会话。会话对象中的字段列在下面:

名称 类型 描述
功能 对象 会话提供的正确功能。
startTime 字符串 这指示会话的开始时间,采用 ISO-8601 格式。
原型 对象 插槽应具有的最小功能组。例如:{"browserName": "chrome"}
uri 字符串 与会话交互的节点 uri。

至此,我们对 Selenium Grid 架构教程的全面概述就结束了。我们首先介绍了 Selenium Grid 的关键组件是什么,通信方法是什么,这些组件之间的依赖关系是什么,节点注册是如何完成的,Selenium Grid 中的节点状态对象、槽对象和会话对象中的字段是什么。

这使您具备了 Selenium Grid 架构的深入知识。明智的做法是不断实践您所学到的知识,并探索与 Selenium 相关的其他知识,以加深您的理解并扩展您的视野。

广告