Java driver.wait()抛出IllegalMonitorStateException

Java driver.wait()抛出IllegalMonitorStateException,java,testing,selenium,webdriver,selenium-webdriver,Java,Testing,Selenium,Webdriver,Selenium Webdriver,wait(…)的所有变体都从以下代码中抛出以下异常。我做错了什么 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://d

wait(…)的所有变体都从以下代码中抛出以下异常。我做错了什么

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();
        }
只有使用
synchronized
为对象获取了锁,才能对对象进行锁定

我不知道您是否打算使用WebDriver使用
wait
——如果是,您需要类似以下内容:

synchronized (driver)
{
    driver.wait();
}
然而,如果你在等待某件事的发生,那么更有可能是你打算使用的另一种方法。也许吧?

我希望这对你有帮助

driver.manage().timeouts().implicitlyWait(长时间,java.util.concurrent.TimeUnit);

WebDriverWait wait=new-WebDriverWait(驱动程序,长时间超时秒);
WebElement=wait.until(presenceOfElementLocated(org.openqa.selenium.By locator));
请注意,我没有执行这段代码,因为我没有webdriver,但我是在参考javadocs之后编写的


请参阅以了解更多详细信息。

这是一个necro,但由于没有更好的答案,其他人可能会这样做:您调用了错误的方法

您可能打算调用selenium方法来等待条件:

您实际调用的是非常原始的多线程方法(等待其他人在您的线程上调用notify()):
使用下面的代码,这将起作用

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

driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS)是最好的解决方案。否则,您必须将
驱动程序包围起来。通过同步块等待

显然,从seleniunm 2开始不需要等待,因为它支持隐式等待。对于隐式等待,您只需要使用一个findElement方法,如果目标元素不存在或不可见,Selenium将等待它出现。不幸的是,这个例子已经过时了,但是如果你看看我最近的一些例子,希望你会发现它们是有效的。此处有错误,最后一行不应将超时作为wait.until的参数。至少,2015年的代码还没有发布(但我也不明白为什么旧版本会有这种重复)。@EricaKane-谢谢你指出这一点。我已经纠正了它。这对我有效
driver.manage().timeouts().implicitlyWait(2000,TimeUnit.ms)