Selenium 4.0 beta版已经发布,那么距离正式版已经不远了,在Selenium 4.0中变化比较大的就是Grid了,本文翻译了官方文档,重点介绍Grid 4的工做原理java
Hubnode
Hub是发送全部测试的中心点。每一个selenium Grid刚好由一个Hub组成。Hub须要可以从各自的客户端(即CI服务器、开发人员机器等)访问。Hub将链接一个或多个Node
测试的节点。python
Nodeweb
Node是在单个计算机系统上执行测试的不一样的Selenium实例。Grid中能够有许多节点。做为Node的机器不须要与Hub或其余Node的平台相同,也不须要具备相同的浏览器选择。Windows上的节点能够提供Internet Explorer做为浏览器选项,而这在Linux或Mac上是不可能的。chrome
Router 路由器shell
路由器负责将请求转发到正确的组件。浏览器
他是Grid的入口点,接收全部外部的请求。路由器行为的不一样依赖于接受的请求。服务器
若是是一个新的会话请求,路由器会把它发送给New Session Queuer
,将其添加到New Session Queue
, New Session queuer
经过Event Bus
触发一个事件。Distributor
(处理新的会话建立的位置)将会接收事件并轮询新Session Queue
来得到新会话请求。session
若是请求属于已存在的会话, 路由器发送session id 到 Session Map
, 而后Session Map
返回会话运行的Node
。此后,路由器发送请求给Node
。分布式
Distributor 分配器
Distributor
知道全部的Node
以及他们的能力。它的主要角色是接收新的 session 请求,找到适合的Node
来建立会话。Distributor
在Session Map
中存储session id和正在执行会话的Node
之间的关系。
Node 节点
一个Node
能够在Grid中屡次建立。每一个Node
负责管理运行所在机器的可用浏览器。
Node
经过 Event Bus
向Distributor
注册。它的配置做为注册消息的一部分发送。
默认状况下,Node
自动注册所在主机上因此能够运行的浏览器驱动程序。它还为基于Chromium 的浏览器和 Firefox 的每一个可用 CPU 建立一个 slot(插槽?不会翻译)。针对Safari 和 IE 只建立一个slot。经过在特定的配置,它能够在Docker容器中建立会话。你能够看到更多配置描述在后面的使用介绍中。
Node
只执行接收到的命令。它不会评估、判断和控制任何事情。Node
运行的主机不须要拥有与其余组件相同的操做系统。例如,Windows主机的Node
提供IE浏览器选项,而这在Linux或Mac主机上是不可能的。
Session Map 会话映射
Session Map
是一个数据存储,保存session id 和运行会话的Node
信息。它在向Node
转发请求的过程当中为Router
提供支持。Router
将向Session Map
请求与 session id相关联的Node
。当以彻底模式启动Grid,Session Map
是第一个被启动的组件。
New Session Queuer 新会话队列者
New Session Queue 新会话队列
New Session Queuer
是惟一能够与New Session Queue
通讯的组件。它处理全部的队列操做,例如,像“add”去操做队列。它提供配置参数设置请求超时和请求重试的间隔。
New Session Queuer
经过Router
接收新会话请求并将其添加到队列中。Queuer等待直到它收到请求的响应。若是请求超时,请求马上被拒绝而且不会添加到队列中。
若是请求的功能在任何已注册的Node
都不存在,那么请求马上被拒绝,客户端收到响应。
若是请求的功能与任何Node
的slots 匹配,Distributor
将尝试获取可用的slots,若是全部slots都很忙,Distributor
将要求Queuer将请求添加到队列前面。在请求重试间隔后,Distributor
再次接受请求。不停的尝试重试,直到请求成功或超时。若是请求在重试可添加到队列前超时,则其被拒绝。
在得到可用的slots和建立会话以后,Distributor
经过Event Bus
将新会话响应传递给New Session Queuer
。New Session Queuer
在接收到事件时响应客户端。
Event Bus 事件总线
Event Bus
总线充当Node
、Distributor
、 New Session Queuer
和 Session Map
之间的通讯路径。Grid经过消息进行大部分的内部通讯,避免了昂贵的HTTP调用。
Role In Grid
在Grid3中,组件分Hub
和Node
, 经过独立模式下运行Grid,能够将他们放在一块儿运行。一样的概念在Grid4中也是能够的。能够经过将上面描述的一些组件分组来运行Hub
,也能够在独立模式下同时运行全部组件。
Hub
Hub 是如下组件的总合:
· Router
· Distributor
· Session Map
· New Session Queuer
· Event Bus
它支持经典的Hub & Node
的设置。
Standalone
如前所述, Standalone是全部组件的总和。在用户看来,它们是做为一个组件执行的。这包括做为Hub
的全部组件,以及一个Node
。在Standalone启动后,可使用一个功能齐全的Grid。
Standalone Mode
一个新的Selenium Server jar 包含了运行Grid的全部内容。它是运行Selenium Grid的最简单模式。默认状况下,服务监听http://localhost:4444
,你能够在程序中调用RemoteWebDriver
类访问这个URL进行测试,服务器从系统路径中检测到可用的驱动程序。
> java -jar .\selenium-server-4.0.0-beta-1.jar standalone 18:02:39.622 INFO [LogManager$RootLogger.log] - Using the system default encoding 18:02:39.625 INFO [OpenTelemetryTracer.createTracer] - Using OpenTelemetry for tracing 18:02:43.351 INFO [NodeOptions.report] - Adding Chrome for {"browserName": "chrome"} 16 times 18:02:43.352 INFO [NodeOptions.report] - Adding Firefox for {"browserName": "firefox"} 16 times 18:02:43.812 INFO [Node.<init>] - Binding additional locator mechanisms: id, name 18:02:43.826 INFO [LocalDistributor.add] - Added `node` 40291796-b2da-40a8-8b3a-b20a5c80b65d at http://10.2.212.186:4444. 18:02:43.830 INFO [GridModel.setAvailability] - Switching `node` 40291796-b2da-40a8-8b3a-b20a5c80b65d (uri: http://10.2.212.186:4444) from DOWN to UP 18:02:45.583 INFO [Standalone.execute] - Started Selenium Standalone 4.0.0-beta-1 (revision Unknown): http://10.2.212.186:4444
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver import DesiredCapabilities dr = webdriver.Remote(command_executor='http://127.0.0.1:4444', desired_capabilities=DesiredCapabilities.CHROME.copy() ) dr.get("https://www.baidu.com") dr.find_element(By.ID, "kw").send_keys("selenium grid4") dr.find_element(By.ID, "su").click() dr.close()
Hub and Node Mode
> java -jar .\selenium-server-4.0.0-beta-1.jar hub
> java -jar .\selenium-server-4.0.0-beta-1.jar node
在 Selenium 4.0 中,咱们还添加了GraphQL,这是一种能够轻松查询必要数据并得到彻底相同数据的新方法。
如下两种模式比较复杂一些,也是Grid4真正区别于Grid3的功能,后续再介绍!