2011-05-02 75 views
5

wait(...)的所有變體都從下面的代碼拋出下面的異常。我究竟做錯了什麼?driver.wait()拋出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如果你已經獲得鎖它使用​​的對象上即可。

我不知道你是否是意味着使用webdriver的使用wait - 如果你是,你需要這樣的:

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

但是,如果你在等待的東西發生的時候,它更有可能是你想要使用的另一種方法。也許WebDriverWait

+0

顯然,從seleniunm 2開始並不需要等待,因爲它支持隱式等待。對於隱式等待,您只需使用其中一個findElement方法,並且如果目標元素不存在或不可見,Selenium將一直等到它。不幸的是,這個例子已經過時了,但是如果你看看我最近的一些例子,希望你會發現它們的工作。 http://seleniumexamples.com/blog/examples/selenium-2-examples/ – 2011-05-02 17:20:27

6

我希望這有助於你

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

OR

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

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

請注意,我沒有webdriver的,但我指的javadoc後寫了這個我還沒有執行該代碼。

欲瞭解更多詳情,請參閱javadocs

+0

這裏有一個錯誤,最後一行不應該包含timeout作爲wait.until的參數。至少,不是2015年的代碼(但我不明白爲什麼舊版本會有這種重複)。 – 2015-04-02 00:39:19

+0

@EricaKane - 感謝您指出。我已糾正它。 – 9ikhan 2015-04-03 08:50:49

0

使用下面的代碼,這將工作。

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