单击Facebook Post按钮时出现java.lang.IllegalMonitorStateException

时间:2019-07-14 05:26:20

标签: java selenium selenium-webdriver action webdriverwait

该元素已启用并显示。但是,尝试单击按钮元素时出现错误。

  

错误:java.lang.IllegalMonitorStateException

查看我的代码以获取更多详细信息。

Actions actions = new Actions(driver);
actions.moveToElement(element, element.getLocation().x, element.getLocation().y).wait(3000);
element.click();

2 个答案:

答案 0 :(得分:1)

IllegalMonitorStateException

根据 Java文档 IllegalMonitorStateException进行抛出,以表明某个线程已尝试在对象的监视器上等待,或者通知其他线程在不拥有指定监视器的情况下在对象的监视器上等待

public class IllegalMonitorStateException
extends RuntimeException

从类java.lang.Object继承的相关方法如下:

  • Object.notify():唤醒在该对象的监视器上等待的单个线程。
  • Object.notifyAll():唤醒该对象的监视器上正在等待的所有线程。
  • Object.wait():使当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法。
  • Object.wait(long):使当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法,或者经过指定的时间。 li>
  • Object.wait(long, int):使当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法,或者某个其他线程中断了当前线程,或者某个实时量已经过去。

当您使用Selenium时,此处无法使用这些wait()方法,您需要将WebDriverWaitExpectedConditions结合使用,并且可以使用以下解决方案:

WebElement element = driver.findElement(By.cssSelector("css_of_the_element"))
new Actions(driver).moveToElement(new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(element))).click().build().perform();
  

在这里您可以找到有关Difference between driver.manage.wait(long timeout) and Explicit wait的相关讨论

答案 1 :(得分:0)

仅当您已使用同步获取对象的锁时,您才能等待它。

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

尝试一下:

 synchronized(actions){
 actions.moveToElement(element, element.getLocation().x, element.getLocation().y).wait(3000);
 }