Selenio - Sincronización

Para sincronizar entre la ejecución del script y la aplicación, debemos esperar después de realizar las acciones adecuadas. Veamos las formas de lograr lo mismo.

Hilo de dormir

Thread.Sleep es una espera estática y no es una buena forma de usarlo en scripts, ya que es dormir sin condición.

Thread.Sleep(1000); //Will wait for 1 second.

Esperas explícitas

Una 'espera explícita' espera a que ocurra una determinada condición antes de continuar. Se utiliza principalmente cuando queremos hacer clic o actuar sobre un objeto una vez que está visible.

WebDriver driver = new FirefoxDriver();
driver.get("Enter an URL"S);
WebElement DynamicElement = 
   (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.id("DynamicElement")));

Espera implícita

La espera implícita se utiliza en los casos en que WebDriver no puede localizar un objeto inmediatamente debido a su indisponibilidad. WebDriver esperará un tiempo de espera implícito especificado y no intentará encontrar el elemento nuevamente durante el período de tiempo especificado.

Una vez que se supera el límite de tiempo especificado, el webDriver intentará buscar el elemento una vez más por última vez. Tras el éxito, procede con la ejecución; si falla, lanza una excepción.

Es una especie de espera global, lo que significa que la espera se aplica a todo el controlador. Por lo tanto, codificar esta espera por períodos de tiempo más largos dificultará el tiempo de ejecución.

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("Enter an URL");
WebElement DynamicElement = driver.findElement(By.id("DynamicElement"));

Espera fluida

Una instancia de FluentWait define la cantidad máxima de tiempo de espera para que se produzca una condición, así como la frecuencia con la que se verifica la existencia de la condición del objeto.

Digamos que tardaremos 60 segundos en que un elemento esté disponible en la página, pero comprobaremos su disponibilidad una vez cada 10 segundos.

Wait wait = 
   new FluentWait(driver).withTimeout(60, SECONDS).pollingEvery(10, SECONDS).ignoring(NoSuchElementException.class);
   
   WebElement dynamicelement = wait.until(new Function<webdriver,webElement>() {
   
   public WebElement apply(WebDriver driver) {
      return driver.findElement(By.id("dynamicelement"));
   }
});