使用 Kubernetes 部署时,Selenium Hub 无法处理测试队列

Selenium Hub cannot handle test queue when deployed with Kubernetes

当我 运行 针对使用 K8s 部署的 selenium 网格并行测试时,我目前 运行 遇到了这个异常。我在 AWS 和 Azure 中都部署了集群,但收到了同样的错误。当我尝试 运行 多于节点的测试时发生错误,我可以成功 运行 一些测试,然后在很短的时间后,所有剩余的测试都会失败并出现此错误.

OpenQA.Selenium.WebDriverException : A exception with a null response was thrown sending an HTTP request to the remote WebDriver server for URL xxxxxx.xxx.xxx/wd/hub/session. The status of the exception was ConnectionClosed, and the message was: The underlying connection was closed: The connection was closed unexpectedly.

我已经调整了 selenium hub 的超时(浏览器超时、超时、newsessiontimeout)以及 remotewebdriver 的命令超时,没有任何变化。我在本地测试时也没有收到错误。

这是我当前的堆栈。

代码:

    [TestCaseSource(typeof(MyFactoryClass), nameof(MyFactoryClass.TestCases))]
    public void ZaleniumTest(int x)
    {
        var caps = new DesiredCapabilities();
        caps.SetCapability("browserName", "chrome");
        var driver =
            new RemoteWebDriver(new Uri(Url), caps, TimeSpan.FromSeconds(1200)) {Url = "http://www.google.com"};
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(1200);
        var query = driver.FindElement(By.Name("q"));
        query.SendKeys("Cheese");
        query.Submit();
        System.Threading.Thread.Sleep(3000);
        Assert.IsTrue(driver.Title.Contains("Google"));
        driver.Quit();
    }      

以下是我 运行 部署网格的命令:

    kubectl run selenium-hub --image selenium/hub:latest --port 4444
    kubectl expose deployment selenium-hub --type=LoadBalancer
    kubectl run selenium-node-chrome --image selenium/node-chrome:latest --env="HUB_PORT_4444_TCP_ADDR=selenium-hub" --env="HUB_PORT_4444_TCP_PORT=4444"

通过这个简单的网格设置(1 个集线器 1 chrome 个节点),我尝试 运行 20 个测试,期望这些测试将排队。在大约 10 次通过测试后,测试 运行 将失败并产生该错误。

我正在寻找添加等待或超时的正确位置,以便我们可以正确处理测试队列。

提前致谢。

您没有说明您要连接的主机。您确定要连接到 Kubernetes 创建的负载均衡器吗?
尝试 kubectl expose deployment selenium-hub --type=LoadBalancer --name=my-service 然后是 kubectl describe services my-service.
这应该告诉您设置负载平衡器是否存在问题,以及您实际应该连接到什么IP/host。

我找到了问题所在。事实证明,AWS 和 Azure 中的负载均衡器都有空闲超时设置。对于我在 AWS 中的案例,它被设置为 60 秒。我将超时设置为 3600 秒,这似乎解决了问题。