나는 당신이 찾고있는 것을 정확하게 얻을 수있을 것이라고 생각하는 이유를 설명하려고 시도 할 것입니다.
특정 허브가 "사용할 수 없음"일 수있는 두 가지 시나리오가 있습니다. 첫 번째는 허브가 실행되지 않는 경우입니다. 허브가 수동으로 종료되었거나 오류가 발생했거나 시작되지 않았습니다 (재부팅 후).
허브가 사용 가능하지만 현재 요청을 처리 할 수있는 노드가없는 경우입니다. 이는 모든 요청을 처리 할 수 있고 현재 최대 요청 수를 실행중인 노드가 하나만있을 경우 발생할 수 있습니다.
첫 번째 시나리오는 찾는 것이 가장 쉽습니다. 원격 서버에 연결하여 해당 서버가 수신 대기중인 서버인지 확인하십시오.
/// <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;
}
희망이 있습니다.
정확히 내가 요구하는 것이 아닙니다. 허브에 대한 기본 포트 구성은 4444이므로 허브를 시작할 때 명시 적으로 지정할 필요가 없습니다. 그러나 여러 개의 허브를 실행하려면 각 허브에 포트를 지정할 수 있습니다. 내 위치 : 4444 및 : 4445. 이 허브의 노드는 별도입니다. 그래서 내가 알고 싶은 것은 시운전 전에 어느 허브를 사용할 수 있는지입니다. – Yulia
제 생각에는 어느 허브에 사용 가능한 노드가 있는지 알 수 없습니다. 너 스스로 처리해야 해. 프로젝트가 노드에 대해 실행될 때 데이터베이스 업데이트를 수행합니다. 그러면 노드가 사용 중인지 알 수 있습니다. 그런 다음 DB의 개수와 구성된 전체 노드 (정적 변수 철저)의 차이가 있는지 확인하고 이에 따라 필요한 부분을 가리킬 수 있습니다. – Scal