2011-05-02 12 views
5

Todas las variaciones de wait (...) arrojan la siguiente excepción del siguiente código. ¿Qué estoy haciendo mal?driver.wait() arroja 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(); 
     } 

Respuesta

19

Sólo wait sobre un objeto si ha adquirido el bloqueo para que el uso de synchronized pueda.

No sé si eres significaba utilizar wait usando WebDriver - si es así, lo que se necesita algo como:

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

Sin embargo, si usted está esperando que algo ocurrir, es más probable que haya un método alternativo que está destinado a usar. Tal vez WebDriverWait?

+0

Aparentemente, no se requiere esperar desde seleniunm 2 en adelante, ya que admite esperas implícitas. Con esperas implícitas, solo necesita usar uno de los métodos findElement, y si el elemento objetivo no existe o no está visible, Selenium esperará hasta que lo haga. Lamentablemente, este ejemplo no está actualizado, sin embargo, si mira algunos de mis ejemplos más recientes, con suerte verá que están funcionando. http://seleniumexamples.com/blog/examples/selenium-2-examples/ –

6

espero que esto le ayuda

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

O

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

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

Tenga en cuenta que no he ejecutado este código como no tengo WebDriver pero escribí esto después de referirse a javadocs .

Consulte javadocs para obtener más detalles sobre esto.

+0

Aquí hay un error, la última línea no debe incluir el tiempo de espera como parámetro para wait.until. Al menos, no como en el código de 2015 (pero no puedo ver por qué la versión anterior tendría esa duplicación). –

+0

@EricaKane - Gracias por señalarlo. Lo he corregido – 9ikhan

0

Esto es una necro, pero ya que no hay mejores respuestas, y podría pasar otra persona: estás llamando al método equivocado.

Probablemente la intención de llamar al método de selenio que esperar para una condición: https://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/support/ui/WebDriverWait.html

Lo que se llama en realidad era el método multihilo muy primitiva (que esperar hasta que alguien ha llamado a notificar() en su hilo): https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

0

Utilice el siguiente código, esto funcionará.

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