2012-05-07 2 views
0

Eclipse에서 Java로 Selenium RC를 실행 중입니다. 문제는 selenium.click 명령을 사용하는 것입니다. 클릭하는 링크가 새 페이지를로드합니다. 때로는 5 초가 걸리고 때로는 2 ~ 3 분이 걸립니다. 페이지가로드 될 때마다 즉시 테스트가 실패하고 "작업 완료를 기다리는 시간이 초과되었습니다"라는 메시지가 나타납니다.Selenium.click 작업 완료를 기다리는 시간 초과되었습니다.

대신로드중인 페이지를 확인하기 위해 selenium.isElementPresent를 사용하려고했습니다. 그러나 디버그 모드로 실행하면 셀렌을 지나칠 수 없다는 것을 알 수 있습니다. 클릭하면 요소 검사 지점까지 도달합니다. 내가 아는 바로는 기다림이 selenium.click 명령에 내장되어 있습니다. 그래서 내 질문은, 그 대신에 셀레늄을 사용할 수있는 내장 된 대기열을 무시하는 방법을 아는 사람이 있습니까? isElementPresent 대신?

selenium.click(Link); 
for (int i = 0; i < 60 ; i++) { 
    if (selenium.isElementPresent(Home)) { 
     break; 
    } 
    Thread.sleep(1000); 
} 

나는 또한 URL로 직접 이동 및 링크를 완전히 건너 뛰고 다음 페이지가로드 확인하기 위해 selenium.isElementPresent를 사용하려면 selenium.open를 사용하여 시도했습니다. 동일한 오류 메시지가 나타나기 전에 실제로 for 루프에 도달하지 않는 곳에서 같은 문제가 발생합니다.

+0

당신은 절대로 for 문으로 가지 않습니다. 그것은 for (int i = 0; i <60; i ++)이어야합니다. –

+0

방금 ​​알아 챘습니다. 오타가 문제 였지만 실제 코드가 아니므로 여기에서 수정했습니다. 그래도 같은 문제가 발생합니다. – Melekal

답변

1

동일한 문제가 발생했습니다. 나는 단지 try/catch와 함께 click 명령을 감싸서 오류가 잡히게 한 다음 어설 션 제목을 작성하고 페이지의 예상 텍스트를 확인했습니다.

+0

실제로 try/catch를 사용하여이를 둘러 쌌습니다. 나는 여전히 오류를 잡을 수는 있지만 내 테스트가 실패하지 않도록로드 된 페이지를 확인하는 다른 방법을 사용할 수 있습니다. 제안 해 주셔서 감사합니다. – Melekal

0

해결 방법은 테스트중인 응용 프로그램의 특성에 따라 다릅니다.

selenium.click(Link); 
selenium.waitForPageToLoad(60000); 

참고 : 클릭 액션, 새로운 페이지를로드하는 경우 다음과 같이 당신은 셀레늄의 waitForPageToLoad 명령을 사용할 수 있습니다 매개 변수는 밀리 초 단위로 시간 제한 값입니다. 따라서 페이지가로드 될 때까지 최대 60 초가 소요됩니다. 사실 반환하거나 두 번째로 주어진 시간 초과 값에 도달 할 때까지

selenium.waitForCondition("selenium.isElementPresent(\"Home\")", 60000); 

셀레늄이 지속적으로 isElementPresent 방법을 실행합니다

아마

그 클릭에 대한 가장 좋은 해결 방법 기다리 기능은 다음과 같은 셀레늄의 waitForCondition 방법을 사용하는 것입니다 매개 변수. 또한 selenium.waitForConditionselenium.isTextPresent을 실행하여 스크립트로 이동하기 전에 텍스트가 화면에 나타나는지 확인할 수 있습니다.

+0

사실 내가 여기에 들어가는 문제는 내 테스트가 셀레늄을 지나치지 않는다는 것입니다.click 명령을 사용하여 selenium.waitForPageToLoad 또는 selenium.waitForCondition으로 이동하십시오. selenium.click은 기다렸다가 내장 된 페이지를 확인하는 다른 방법을 사용할 수없는 것 같습니다. – Melekal

1

이 메서드/함수를 코드에 통합하는 것이 좋습니다.

public static void WaitForPageToLoad(IWebDriver driver) 
    { 
     TimeSpan timeout = new TimeSpan(0, 0, 2400); 
     WebDriverWait wait = new WebDriverWait(driver, timeout); 

     IJavaScriptExecutor javascript = driver as IJavaScriptExecutor; 
     if (javascript == null) 
      throw new ArgumentException("driver", "Driver must support javascript execution"); 

     wait.Until((d) => 
     { 
      try 
      { 
       string readyState = javascript.ExecuteScript("if (document.readyState) return document.readyState;").ToString(); 
       return readyState.ToLower() == "complete"; 
      } 
      catch (InvalidOperationException e) 
      { 
       //Window is no longer available 
       return e.Message.ToLower().Contains("unable to get browser"); 
      } 
      catch (WebDriverException e) 
      { 
       //Browser is no longer available 
       return e.Message.ToLower().Contains("unable to connect"); 
      } 
      catch (Exception) 
      { 
       return false; 
      } 
     }); 
    } 

때때로 셀레늄의 .Click()은 자체 참조 응답을 기다립니다. 이를 능가하고 테스트를 진행하려면 코드에 다음을 수행하십시오.

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30)); 

    try{ selenium.click(Link); } 
    catch(WebDriverException) {} 
    WaitForPageToLoad(driver); 
    //look for your element. 

암시 적 대기와 결합하여 JavaScript가 페이지로드를 다시보고하면 요소를 찾을 수 있습니다. 60 초 이내에 요소를 찾지 못하는 셀레늄보다 훨씬 역동적이라고 느낍니다.

관련 문제