Selenium 简明教程

Selenium Grid - Architecture

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

Components of Selenium Grid

Selenium Grid 的主要组件如下:

  1. Event Bus - 事件总线用于传送可能在其他组件之间异步获取的消息。

  2. Distributor - 分发器会跟踪 Selenium Grid 中的每个可访问资源,这些资源可用于启动会话(称为时段)并接受新的内部请求并为其提供时段。

  3. Node - 节点用于执行 webdriver 会话。每个会话都会提供一个时段,一个节点可以拥有多个时段,也可以不拥有。

  4. Session Map - 会话映射在会话 ID 和会话运行的节点位置之间保持关系。

  5. New Session Queue - 新会话队列存储未分配到给定节点的传入会话列表。

  6. Router - 路由器就像是 Selenium Grid 的门面,并暴露在网络中。路由器将传入请求定向到新会话队列或正在进行会话的节点。

  7. Slot - 插槽是会话可以执行的位置。插槽应具备一些新会话请求应匹配的最低特征,以便分配器可以将该请求分派给具有插槽的节点。

  8. Grid Model - 网格模型描述了分配器监视 Selenium Grid 性能的方式。

Communication Methods Among the Components

Selenium Grid 中组件之间的通信方法如下所示 -

  1. 通过 HTTP 请求的同步 JSON。

  2. 异步事件分派到事件总线。

在执行任务同步,或错失响应会很困难的情况下,会执行同步通信。然而,在仅进行信息广播或错失响应无所谓的情况下,将异步通信发送到事件总线。

Dependencies Among the Selenium Grid Components

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

  1. 会话映射和事件总线首先启动。它们相互独立,可以同时工作。

  2. 接下来,会话队列开始。

  3. 接下来,分配器可以启动。它将定期连接到会话队列并轮询作业。可以按时间间隔或按事件进行轮询。

  4. 此时,路由器可以启动。新会话请求已发送至会话队列,并且分配器将尝试查找用于执行会话的插槽。

  5. 接下来,可以启动节点。完成节点注册后,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 相关的其他知识,以加深你的理解并拓展你的视野。