2011-06-16 26 views
7

Tengo un problema al hacer clic en un botón con Selenium 2.0b3 API de Java con FirefoxDriver. Al hacer clic en el botón se envía un formulario al servidor web y luego el navegador va a una nueva página como resultado del envío del formulario.Selenium 2: Interrumpir una carga de página

Al hacer clic en un elemento con element.click(), el selenio está esperando que el navegador complete sus operaciones. El navegador espera hasta que la carga de la página finalice. Pero, a veces, la carga de la página lleva una gran cantidad de tiempo debido a algunas solicitudes de publicidad.

Cómo evitar la sincronización entre element.click() y la carga de la página?

EDIT:

Como se explica en la WebElement javadoc:

Haga clic en este elemento. Si esto hace que se cargue una nueva página , este método bloqueará hasta que la página se haya cargado.

Gracias

Respuesta

1

driver.get() es en realidad supone para bloquear hasta que la página ha terminado de cargar. Sin embargo, a veces no lo hace, por ejemplo, si JavaScript continúa cargándose después de que se cargó el HTML principal. En este caso, a veces tendrás problemas para hacer clic en elementos que aún no han aparecido. También se puede usar WebDriverWait() para esperar a que el elemento que aparezca o aumentar el tiempo de espera implícita con:

driver.manage().timeouts().implicitlyWait(X, TimeUnit.SECONDS); 

Aquí es el equivalente utilizando WebDriverWait:

public void waitAndClick(WebDriver driver, By by) { 
    WebDriverWait wait = new WebDriverWait(driver, 10000); 
    Function<WebDriver, Boolean> waitForElement = new waitForElement(by); 
    wait.until(waitForElement); 

    Actions builder = new Actions(driver); 
    builder.click(driver.findElement(by)).perform(); 
} 

Y la clase waitForElement:

public class waitForElement implements Function<WebDriver, Boolean> { 
    private final By by; 

    private String text = null; 

    public waitForElement(By by) { 
     this.by = by; 
    } 

    public waitForElement(By by, String text) { 
     this.by = by; 
     this.text = text; 
    } 

    @Override 
    public Boolean apply(WebDriver from) { 
     if (this.text != null) { 
      for (WebElement e : from.findElements(this.by)) { 
       if (e.getText().equals(this.text)) { 
        return Boolean.TRUE; 
       } 
      } 

      return Boolean.FALSE; 
     } else { 
      try { 
       from.findElement(this.by); 
      } catch (Exception e) { 
       return Boolean.FALSE; 
      } 

      return Boolean.TRUE; 
     } 
    } 
} 
+0

Mike, he editado la pregunta. El problema no es la espera implícita. No estoy esperando a que aparezca un elemento. Hago clic en un elemento y solo luego se produce una carga de página. Esa carga me está molestando porque puede llevar mucho tiempo completar cargar elementos inútiles para mi prueba. – djondal

+0

No conozco una forma integrada de hacer un get asincrónico(). Sin embargo, puedes hacerlo con bastante facilidad lanzando un nuevo hilo para hacer el get() –

0

Esto no se ha probado, pero pensé que podría tirarlo para usted. Pensé que tal vez podrías solucionarlo creando una acción personalizada.

protected static void maybeAsyncClick(WebElement element, WebDriver driver) 
{ 
    Actions builder = new Actions(driver); 
    Action newClick = builder.moveToElement(element) 
          .click() 
          .build(); 
    newClick.perform(); 
} 
2

Prueba la versión beta sólo para Firefox aparece en la última sección de la página wiki firefoxdriver http://code.google.com/p/selenium/wiki/FirefoxDriver

Usted necesitará por lo menos la versión 2.9, recomiendo ir con la última 2,18 (2.0b3 es casi una año de edad ahora!)

+0

¡Esto funcionó como un amuleto! Lo hice implícitamente esperar unos 30 segundos (debería ser suficiente para una conexión a Internet rápida) y fue capaz de continuar sin esperar elementos laggy. +1 para usted señor. – samxli

Cuestiones relacionadas