Espera implícita y explícita en Selenium

Índice
¿Por qué son necesarias las esperas en Selenium?
En la automatización de la interfaz de usuario, las esperas son necesarias porque algunos elementos se cargan de forma asíncrona en la página, de modo que después de que se active un evento, la página puede cargarse correctamente, pero algunos elementos pueden seguir descargándose.
Esto provoca una excepción elementNotFound al buscar un elemento. En estos casos nos queda utilizar Thread.sleep(), t. j. Espera estática, que detiene la ejecución de la prueba durante un tiempo determinado y luego ejecuta el paso siguiente.
Ya que Thread.sleep() esperará el tiempo especificado independientemente de si los elementos se muestran antes de ese tiempo. Por tanto, nunca se recomienda utilizar Thread.sleep() al automatizar la interfaz de usuario.
Para evitarlo, Selenium proporciona distintos tipos de esperas, de las cuales las esperas Implícitas y Explícitas son las más utilizadas.
Espera implícita
La espera por defecto se establece en la instancia del WebDriver cuando se utiliza y se aplica a todos los elementos web. Con la espera implícita, el webdriver consulta el DOM para comprobar la disponibilidad del elemento web y espera hasta el tiempo máximo especificado antes de lanzar una excepción NoSuchElementException.
WebDriver driver = nuevo FirefoxDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
En el fragmento de código anterior, el valor 20 especificado en el método wait implícito es el tiempo máximo en segundos que esperará el WebDriver antes de lanzar una excepción NoSuchElementException al buscar un WebElement.
Espera explícita
A diferencia de la espera implícita, la espera explícita se aplica a cada elemento web. La espera explícita define ciertas condiciones en las que una instancia de WebDriver espera antes de recuperar elementos Web o realizar acciones sobre ellos. Algunas de las condiciones más comunes especificadas en la espera explícita son: elementToBeClickable, presenceOfElementLocated, etc.
WebDriverWait wait = nuevo WebDriverWait(controlador, 15);
espera.hasta(ExpectedConditions.presenceOfElementLocated(ElementLocator));
Aquí, la instancia WebDriver esperará hasta que se cumpla la condición especificada, es decir j. la presencia de un elemento localizado por ElementLocator con un tiempo máximo de espera de 15 segundos, transcurridos los cuales, si aún no se cumple la condición, lanza una excepción.