2012-12-10 4 views
1

원격 기계의 분산 테스트를 위해 셀레늄 그리드를 사용하고 있습니다. 이 머신에서 실행되는 두 개의 프로젝트가 있으며 개별 프로젝트마다 셀레늄 허브와 노드를 설정하고 싶습니다. 그러나 허브 중 하나를 사용할 수없는 경우 사용 가능한 것으로 테스트를 전달하고 싶습니다.Selenium Webdriver 사용 가능한 허브 포트를 얻으십시오

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"입니다. 정적 기본 포트 대신, 사용 가능한 허브에 따라 동적으로 할당 할 수 있어야합니다. 테스트를 실행하기 전에 사용 가능한 허브를 얻을 수있는 방법이 있습니까?

답변

2

HUB는 사용 가능한 리소스를 사용할 때 그 용도입니다. 테스트 실행이 아닌 구성에 NODES의 포트만 지정해야합니다. 테스트 실행은 허브/브라우저/플랫폼/버전으로 HUB에 연결되어야합니다.

+0

정확히 내가 요구하는 것이 아닙니다. 허브에 대한 기본 포트 구성은 4444이므로 허브를 시작할 때 명시 적으로 지정할 필요가 없습니다. 그러나 여러 개의 허브를 실행하려면 각 허브에 포트를 지정할 수 있습니다. 내 위치 : 4444 및 : 4445. 이 허브의 노드는 별도입니다. 그래서 내가 알고 싶은 것은 시운전 전에 어느 허브를 사용할 수 있는지입니다. – Yulia

+1

제 생각에는 어느 허브에 사용 가능한 노드가 있는지 알 수 없습니다. 너 스스로 처리해야 해. 프로젝트가 노드에 대해 실행될 때 데이터베이스 업데이트를 수행합니다. 그러면 노드가 사용 중인지 알 수 있습니다. 그런 다음 DB의 개수와 구성된 전체 노드 (정적 변수 철저)의 차이가 있는지 확인하고 이에 따라 필요한 부분을 가리킬 수 있습니다. – Scal

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# 코드는 열린 우리당에 요청을 전달 할 것입니다. 그것은 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; 
    } 

희망이 있습니다.

관련 문제