1

我正在使用 selenium 网格在远程机器上进行分布式测试。这台机器上运行了两个项目,我想分别为每个项目设置 selenium hub 和节点。但是,如果其中一个集线器不可用,我想将测试传递给可用的集线器。

    webdriver_hub = '/wd/hub'
    PORT.nil? ? port = ':4444' : port =':' + PORT
    @driver = Selenium::WebDriver.for(
      :remote,
      :url => 'http://' + SELENIUM_HUB + port + webdriver_hub,
      :desired_capabilities => caps,
      :http_client => client
    )

默认端口是“:4444”。我希望能够根据可用的集线器动态分配它,而不是使用静态默认端口。有没有办法在测试运行之前获得可用的集线器?

4

2 回答 2

2

这就是 HUB 的用途,即在可用资源可用时使用它们。您应该只在配置中指定节点的端口,而不是用于测试执行。测试执行应该将 HUB 与您希望对其执行的浏览器/平台/版本连接起来,仅此而已。

于 2012-12-12T14:43:03.613 回答
0

我不确定您到底在寻找什么,所以我将尝试解释我认为您如何能够得到您正在寻找的东西。

在两种情况下,特定集线器可能“不可用”。第一个是集线器未运行时。集线器已手动关闭或因错误关闭,或者只是未启动(可能在重新启动后)。

另一种情况是集线器可用,但当前没有节点可用于服务请求。如果只有一个节点可以为所有请求提供服务并且它当前正在运行最大数量的请求,则可能会发生这种情况。

第一种情况是最容易寻找的。只需尝试连接到远程服务器以确定它是否有服务器在监听它。

    /// <summary>
    /// Will test to verify that a Selenium Hub is running by checking a URL
    /// </summary>
    /// <param name="defaultURL">The url to test.</param>
    /// <returns>true if the hub is running.  false if it is not running.</returns>
    /// <example>IsHubRunning(new Uri("http://localhost:4444/wd/status"));</example>
    static public bool IsHubRunning(Uri defaultURL)
    {
        HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(defaultURL); 
        httpReq.AllowAutoRedirect = false;
        HttpWebResponse httpRes;
        try
        {
            httpRes = (HttpWebResponse)httpReq.GetResponse();
            if (httpRes.StatusCode != HttpStatusCode.OK)
            {
                return false;
            }
        }
        catch (WebException ex)
        {
            // Inspect the exection.  An exception of 500 in the case
            // of Selenium may NOT be a problem.  This means a server is listening.
            if (ex.Response == null || ex.Status == WebExceptionStatus.ConnectFailure)
            {
                return false;
            }

            // Did it return the expected content type.
            if(ex.Response.ContentType != "application/json;charset=UTF-8")
            {
                return false;
            }
            if (ex.Response.ContentLength <= 0)
            {
                return false;
            }

        }
        return true;
    }

上面的 C# 代码将对传入的 Uri 发出请求。它将执行 GET 请求,然后检查返回的状态码。它还测试可能根据您请求的特定 Uri 报告的异常。如果您请求 /wd/status,您应该得到“OK”响应。

这将告诉您集线器是否正在运行。它不会告诉您是否有可用于服务特定请求的节点。您还可以检查响应的其他属性,例如 Server 属性,以确定响应是否来自 Selenium 网格集线器。

第二种情况涉及更多一点。如果您想知道是否可以支持一组特定的功能,那么您可以对 /grid/console Uri 执行类似的查询。这将返回有关节点及其功能的信息。

要确定集线器可以使用哪些节点,只需解析从上述 Uri 返回的信息。但是,这需要您的测试客户端进行大量工作,以确定特定节点在请求的集线器上是否可用。

更好的方法是验证哪个集线器已启动并正在运行。然后尝试创建一个连接,请求来自该集线器的一组特定功能。如果您从中发出请求的集线器表明它无法为请求提供服务,那么您尝试下一个集线器。

下面是一些 C# 代码,可用于确定是否可以从集线器获得一组特定的功能。

    /// <summary>
    /// Determines if the hub can provide the capabilities requested.
    /// The specified hub is used.
    /// </summary>
    /// <param name="dc">The capabilities being requested.</param>
    /// <param name="hub">The hub to make the request to.</param>
    /// <returns>true if the requested capabilities are available, otherwise false;</returns>
    static public bool IsRemoteDriverAvailable(DesiredCapabilities dc, Uri hub)
    {
        bool isAvailable = false;
        // Verify that valid capabilities were requested.
        if (dc == null)
        {
            return isAvailable;
        }

        try
        {
            IWebDriver driver = new RemoteWebDriver(hub, dc);
            driver.Quit();
            isAvailable = true;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error {0}", ex.Message);
        }
        return isAvailable;
    }

希望有帮助。

于 2013-02-26T18:42:22.390 回答