2011-05-02 5 views
5

wait (...)의 모든 변형은 다음 코드에서 아래 예외를 던집니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?driver.wait() throws IllegalMonitorStateException

java.lang.IllegalMonitorStateException 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:485) 
    at LoginPage.main(LoginPage.java:29) 

try 
     { 
      driver.get("http://domain:port/coco/webapp/login/login.faces"); 

      driver.findElement(By.id("clientCode")).sendKeys("coco"); 
      driver.findElement(By.id("systemCode")).sendKeys("consumer"); 
      driver.findElement(By.id("userId")).sendKeys("ffadmin"); 
      driver.findElement(By.id("password")).sendKeys("password"); 

      driver.findElement(By.className("af_commandButton")).click(); 
      driver.wait(); 
      Assert.assertTrue(driver.getPageSource().contains("Administration")); 

     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

답변

19

당신 만 wait 당신이 synchronized 사용에 대한 잠금을 획득 한 경우 개체에 있습니다.

난 당신이 이 WebDriver를 사용하여 wait를 사용하는을 의미하든 모르는

- 당신이, 당신이 뭔가 필요할 것 : 당신이 뭔가를 기다리고 있다면, 그러나

synchronized (driver) 
{ 
    driver.wait(); 
} 

을 발생할 가능성이 높습니다. 사용하려는 대체 방법이있을 가능성이 큽니다. 아마 WebDriverWait?

+0

암시 적 대기를 지원하므로 seleniunm 2 이후로 기다릴 필요가 없습니다. 암시 적 대기 상태에서는 findElement 메소드 중 하나만 사용해야하며 대상 요소가 존재하지 않거나 보이지 않으면 Selenium은 그 때까지 기다립니다. 불행히도이 예제는 오래된 것입니다. 그러나 최근 예제를 살펴보면 잘 작동하는 것으로 나타납니다. http://seleniumexamples.com/blog/examples/selenium-2-examples/ –

6

나는 이것이 내가 webdriver이 없어하지만 난 JavaDoc을 참조 후이 쓴이 코드를 실행하지 않았 음을 유의하시기 바랍니다 당신에게

driver.manage().timeouts().implicitlyWait(long time, java.util.concurrent.TimeUnit unit); 

또는

WebDriverWait wait = new WebDriverWait(driver, long timeOutInSeconds); 

WebElement element = wait.until(presenceOfElementLocated(org.openqa.selenium.By locator)); 

도움이되기를 바랍니다 .

자세한 내용은 javadocs을 참조하십시오.

+0

여기에 오류가 있습니다. 마지막 줄에는 wait.until의 매개 변수로 시간 초과가 없어야합니다. 적어도 2015 년 코드는 아닙니다 (그러나 이전 버전이 그 복제본을 가지고있는 이유는 알 수 없습니다). –

+0

@EricaKane - 지적 해 주셔서 감사합니다. 나는 그것을 바로 잡았다. – 9ikhan

0

이것은 괴사입니다. 그러나 더 좋은 답변이 없기 때문에 다른 사람이 발생할 수 있습니다. 잘못된 방법을 사용하고 있습니다.

당신은 아마 조건을 기다리는 셀레늄 메소드를 호출하도록

: https://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/support/ui/WebDriverWait.html

실제로 매우 원시적 인 멀티 스레딩 방법이었다라는 어떤 (다른 호출 한 사람이 귀하의 스레드에서()에 통보 할 때까지 기다릴 필요) : https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

0

아래 코드를 사용하면됩니다.

synchronized (driver) 
{ 
  driver.wait(2000); 
} 
driver.context(NATIVE_APP); 
driver.findElementByXPath("//android.widget.Button[@resourceid=‘android:id/button1’]").click(); 
관련 문제