1

リモートマシンでの分散テストにセレングリッドを使用しています。このマシンでは 2 つのプロジェクトが実行されており、各プロジェクトのセレン ハブとノードを個別にセットアップしたいと考えています。ただし、ハブの 1 つが利用できない場合は、利用可能なハブにテストを渡したいと思います。

    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 の目的であり、利用可能なリソースを利用できるときに使用します。テストの実行ではなく、構成で NODES のポートのみを指定する必要があります。テストの実行では、HUB を実行対象のブラウザー/プラットフォーム/バージョンに接続する必要があります。

于 2012-12-12T14:43:03.613 に答える
0

あなたが探しているものを正確に把握していないので、あなたが探しているものを手に入れる方法を説明しようと思います.

特定のハブが「利用できない」可能性があるシナリオが 2 つあります。1 つ目は、ハブが実行されていない場合です。ハブが手動またはエラーによってシャットダウンされたか、単に開始されていない (おそらく再起動後) かのいずれかです。

もう 1 つのケースは、ハブが使用可能であるが、要求を処理するために現在使用できるノードがない場合です。これは、すべてのリクエストを処理できるノードが 1 つしかなく、現在最大数のリクエストを実行している場合に発生する可能性があります。

最初のシナリオは、探すのが最も簡単です。リモート サーバーに接続して、リッスンしているサーバーがあるかどうかを確認してください。

    /// <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 グリッド ハブからのものかどうかを判断することもできます。

2 番目のシナリオはもう少し複雑です。特定の機能セットがサポートされているかどうかを知りたい場合は、/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 に答える