【问题标题】:driver.wait() throws IllegalMonitorStateExceptiondriver.wait() 抛出 IllegalMonitorStateException
【发布时间】:2011-08-17 01:19:57
【问题描述】:

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();
        }

【问题讨论】:

    标签: java testing selenium webdriver selenium-webdriver


    【解决方案1】:

    如果您已使用 synchronized 获取对象的锁,则您只能在该对象上使用 wait

    我不知道您是否打算通过 WebDriver 使用 wait - 如果是,您需要类似的东西:

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

    但是,如果您正在等待某事发生,则更有可能您打算使用另一种方法。也许WebDriverWait

    【讨论】:

    • 显然从 seleniunm 2 开始不需要等待,因为它支持隐式等待。使用隐式等待,您只需要使用其中一种 findElement 方法,如果目标元素不存在或不可见,Selenium 将一直等到它存在。不幸的是,这个例子已经过时了,但是如果你看看我最近的一些例子,希望你会发现它们是有效的。 seleniumexamples.com/blog/examples/selenium-2-examples
    【解决方案2】:

    希望对你有帮助

    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));
    

    请注意,我没有执行此代码,因为我没有 webdriver,但我是在参考 javadocs 后编写的。

    请参考javadocs了解更多详情。

    【讨论】:

    • 这里有错误,最后一行不应该包含超时作为wait.until的参数。至少,不是 2015 年的代码(但我不明白为什么旧版本也会有这种重复)。
    • @EricaKane - 感谢您指出这一点。我已经更正了。
    • 这对我有用driver.manage().timeouts().implicitlyWait(2000,TimeUnit.MILLISECONDS);
    【解决方案3】:

    这是一个死灵,但由于没有更好的答案,而且其他人可能会发生:你调用了错误的方法。

    您可能打算调用 selenium 方法来等待条件: https://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/support/ui/WebDriverWait.html

    您实际调用的是非常原始的多线程方法(等到其他人在您的线程上调用了 notify()): https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

    【讨论】:

      【解决方案4】:

      使用下面的代码,这将起作用。

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

      【讨论】:

        【解决方案5】:

        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 是最好的解决方案。否则,你已经用同步块包围了driver.wait

        【讨论】:

          猜你喜欢
          • 2013-08-15
          • 1970-01-01
          • 2014-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-04
          • 1970-01-01
          相关资源
          最近更新 更多