在 Selenium Grid 中使用无限 maxInstance

Use infinite maxInstance in Selenium Grid

我使用默认参数将 Selenium Grid 作为 Hub 启动:

java -jar selenium-server-standalone-3.4.0.jar -role hub

然后我用默认参数启动了一个节点:

java -Dwebdriver.chrome.driver=C:\selenium\driver\chromedrive r.exe -jar selenium-server-standalone-3.4.0.jar -role node -hub http://localhost:4444/grid/register

当我从网络浏览器检查 localhost:4444 时,我看到以下屏幕

正如预期的那样,允许 5 chrome 个实例。

在我执行测试脚本 5 次后,我看到以下屏幕(警告):

所以,我的问题是:这些插槽何时可用?或者,有没有办法设置无限的 maxInstance 值?

在理想情况下,在测试 运行 秒完成后,它应该释放它在网格中占用的 TestSlot。 TestSlot 本质上等同于您在 Grid 控制台上看到的一个浏览器图标。

根据您分享的内容,这是我的推断。

  • 您的节点支持 5 concurrent sessions 所有浏览器版本。这意味着假设您 运行 6 个测试(4 个 Chrome 测试和 2 个 Firefox 测试),只有 5 个 运行 并且您的一个测试将排在队列中 [这就是当网格显示 1 requests waiting for a slot to be free]
  • 时,您会在屏幕上看到

如果您的测试在测试结束时正确调用 RemoteWebDriver.quit(),那么一旦您的 5 个测试中的任何一个 运行 完成,排在队列中的第六个将被接管执行。您不需要做任何额外的事情。

但是,如果您的测试没有调用 quit() 方法,或者如果您的测试本身崩溃了(例如,您杀死了正在 运行 测试的 JVM,或者如果您 运行从 IDE 中调用测试,您按下了 IDE) 的停止按钮,那么这些测试将成为孤立测试。

如果您没有调整任何值,默认情况下网格将执行以下操作:

  • 集线器将 运行 检查它知道的所有活动会话,以检查是否有任何会话挂起等,每 5 秒一次。该值由标志 -cleanUpCycle
  • 控制
  • node 将查找 1800 seconds 剩余 inactive 的测试会话并将其清除。

所以要回答你的第一个问题,

When these slots will be free?

他们将在 30 minutes 之后免费。 这可以通过在集线器端使用以下属性来控制。

  • -browserTimeout 以秒为单位:WebDriver 命令 运行ning 时允许浏览器会话挂起的秒数(示例:driver.get(url)).如果在 WebDriver 命令仍在处理时达到超时,会话将退出。最小值为 60。未指定的零值或负值表示无限期等待。默认值:0
  • -cleanUpCycle 以毫秒为单位:指定集线器为超时(即挂起)线程轮询 运行ning 代理的频率。还必须指定超时 option.Default: 5000(5 秒)
  • -timeout, -sessionTimeout 以秒为单位:指定服务器自动终止会话之前的超时在过去 X 秒内没有任何 activity。然后将释放测试槽以供另一次测试使用。这通常用于处理客户端崩溃。对于网格 hub/node 角色,还必须设置 cleanUpCycle。默认值:1800

详情可以参考我的 SO回复

你的第二个问题

is there any way to set infinite maxInstance value?

是的,有一种方法可以做到这一点,但这实际上会破坏您的网格基础设施。例如,假设您将值设置为 1000,这将导致集线器在您的节点上分拆 1000 个并发浏览器实例。在我看来,这是灾难的根源。

您应该改为尝试利用我在上面分享的清理参数来确保没有陈旧的测试挂起。

为了增加最大会话数,您需要执行以下操作:

  1. 使用参数-maxSession并指定一个值(默认值为5)。您在此处提供的值将是将在节点中的任何给定点同时打开的最大浏览器数量(跨浏览器风格)。
  2. 为了进一步控制每个浏览器的风格,您可以在节点配置文件中为每个浏览器指定 maxInstances

例如,如果您有如下节点配置文件:

{
  "capabilities":
  [
    {
      "browserName": "firefox",
      "maxInstances": 4,
      "seleniumProtocol": "WebDriver"
    },
    {
      "browserName": "chrome",
      "maxInstances": 11,
      "seleniumProtocol": "WebDriver"
    }
  ],
  "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
  "maxSession": 15,
  "port": 5555,
  "register": true,
  "registerCycle": 5000,
  "hub": "http://localhost:4444",
  "nodeStatusCheckTimeout": 5000,
  "nodePolling": 5000,
  "role": "node",
  "unregisterIfStillDownAfter": 60000,
  "downPollingLimit": 2
}

这将导致您的节点最多支持打开 15 个并发浏览器实例,但在这 15 个实例中,最多只能打开 4 个 firefox 实例,并且可以打开 11 个 chrome 个实例。您将使用 -nodeConfig 指定上述 JSON 配置文件的路径。

你可以参考我的SO回复了解Standalone,Hub,Node模式下都有哪些参数

Here's 来自 selenium 代码库本身的模板文件。

希望这能回答您的问题。