Selenium Grid 组件
Selenium Grid 4 是从先前版本开始的全新重写。 除了对性能和标准合规性的全面改进之外,Grid 的不同功能被分解出来,以反映更现代的计算和软件开发时代。 Selenium Grid 4 专为容器化和云分布式可扩展性而构建,是现代时代的全新解决方案。
路由器
路由器是 Grid 的入口点,接收所有外部请求,并将它们转发到正确的组件。
如果路由器收到新的会话请求,它将转发到新会话队列。
如果请求属于现有会话,路由器将查询会话映射以获取会话正在运行的节点 ID,然后请求将直接转发到节点。
路由器通过将请求发送到能够更好地处理它们的组件,来平衡 Grid 中的负载,而不会使过程中不需要的任何组件过载。
分发器
分发器有两个主要职责
注册并跟踪所有节点及其功能
节点通过事件总线发送节点注册事件来向分发器注册。 分发器读取它,然后尝试通过 HTTP 连接到节点以确认其存在。 如果请求成功,分发器将注册该节点,并通过 GridModel 跟踪所有节点的功能。
查询新会话队列并处理任何待处理的新会话请求
当新的会话请求发送到路由器时,它会被转发到新会话队列,在那里它将在队列中等待。 分发器将轮询新会话队列以查找待处理的新会话请求,然后找到可以创建会话的合适节点。 创建会话后,分发器在会话映射中存储会话 ID 和正在执行会话的节点之间的关系。
会话映射
会话映射是一个数据存储,用于保持会话 ID 与会话正在运行的节点之间的关系。 它支持路由器将请求转发到节点的过程。 路由器将向会话映射询问与会话 ID 关联的节点。
新会话队列
新会话队列以 FIFO 顺序保存所有新的会话请求。 它具有可配置的参数,用于设置请求超时和请求重试间隔(检查超时的频率)。
路由器将新的会话请求添加到新会话队列并等待响应。 新会话队列定期检查队列中是否有任何请求超时,如果是,则立即拒绝并删除该请求。
分发器定期检查是否有可用的插槽。 如果有,分发器会轮询新会话队列以查找第一个匹配的请求。 然后,分发器尝试创建新会话。
一旦请求的功能与任何空闲节点插槽的功能匹配,分发器就会尝试获取可用的插槽。 如果所有插槽都繁忙,分发器会将请求发送回队列。 如果在重试或添加到队列前面时请求超时,则会被拒绝。
成功创建会话后,分发器会将会话信息发送到新会话队列,然后会话信息会被发送回路由器,最后发送给客户端。
节点
一个 Grid 可以包含多个节点。 每个节点管理其运行所在的机器上可用浏览器的插槽。
节点通过事件总线向分发器注册自身,其配置作为注册消息的一部分发送。
默认情况下,节点会自动注册在其运行的机器路径上可用的所有浏览器驱动程序。 它还为基于 Chromium 的浏览器和 Firefox 的每个可用 CPU 创建一个插槽。 对于 Safari,只创建一个插槽。 通过特定的 配置,它可以在 Docker 容器中运行会话或中继命令。
节点只执行接收到的命令,它不评估、不做判断或控制命令和响应的流程之外的任何事情。 运行节点的机器不需要与其他组件具有相同的操作系统。 例如,Windows 节点可能具有在 Edge 上提供 IE 模式作为浏览器选项的能力,而在 Linux 或 Mac 上这是不可能的,并且 Grid 可以配置多个具有 Windows、Mac 或 Linux 的节点。
事件总线
事件总线充当节点、分发器、新会话队列和会话映射之间的通信路径。 Grid 的大部分内部通信都是通过消息进行的,避免了昂贵的 HTTP 调用。 当以完全分布式模式启动 Grid 时,事件总线是应该启动的第一个组件。