Este tutorial muestra como facilitar el uso de Selenium WebDriver con el framework Conductor.
Índice de contenidos
1. Introducción
Selenium WebDriver es una herramienta que envía instrucciones a un navegador nativo y recoge los resultados. Su uso más común es automatizar las pruebas de aplicaciones web. Los scripts para Selenium pueden escribirse en uno de varios lenguajes, como Java, Ruby, .Net, y otros.
Conductor es un wrapper de la API Selenium WebDriver que facilita la escritura de tareas comunes. En concreto, Conductor referencia elementos por su selector CSS, mejora la legibilidad de los test encadenando métodos, y realiza esperas sin necesidad de programar pausas explícitas.
2. Entorno
El tutorial está escrito usando OS X, Firefox, e IntelliJ, pero es aplicable a cualquier sistema operativo y navegador.
3. Preparar el proyecto
Voy a implementar los test en un proyecto Maven, así que primero agrego las dependencias necesarias al pom.xml.
pom.xml
<dependencies> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.49.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>io.ddavison</groupId> <artifactId>conductor</artifactId> <version>2.1.1</version> </dependency> </dependencies>
A continuación, creo un fichero base para el test. Normalmente escribiría aquí mis métodos de utilidad para esperar a clicks en enlaces, o hacer más legibles las condiciones a comprobar. Sin embargo Conductor ofrece estas utilidades en la clase Locomotive, que puedo combinar con métodos adicionales propios.
La configuración del driver también se realiza en esta clase. Otra diferencia es que ahora podemos crearla con anotaciones, lo que deja el código más limpio y legible.
BaseTest.java
package com.autentia; import io.ddavison.conductor.Browser; import io.ddavison.conductor.Config; import io.ddavison.conductor.Locomotive; @Config( browser = Browser.FIREFOX, url = "https://adictosaltrabajo.com/" ) public class BaseTest extends Locomotive{ }
4. El primer Test
Una vez preparado el entorno, voy a crear mi primer Test. Sobre la URL indicada en la configuración del BaseTest («https://adictosaltrabajo.com/») voy a validar que se abre la página correctamente, enviar una cadena de texto sobre el campo de búsqueda, solicitar una búsqueda y validar la respuesta.
Para ello creo una clase llamada ConductorTest.java, que hereda del BaseTest.java. Dentro de la clase, creo el test con la anotación @Test de JUnit (Como si se tratara de WebDriver).
Para seleccionar el campo de búsqueda en https://adictosaltrabajo.com es recomendable esperar a que el elemento aparezca tras conectar con la página, pues a veces las páginas tardan en mostrar sus elementos. Voy a buscar el elemento mediante su selector CSS. El selector lo conseguí inspeccionando el código fuente de la web desde el navegador.
Con WebDriver a secas el test se escribiría así:
@Test public void webDriverTest() { //Validación del Título de la página WebDriverWait wait = new WebDriverWait(driver, 15); WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#s"))); element.clear(); element.sendKeys("Selenium"); element.submit(); WebElement elementResult = waitForElement(By.cssSelector("div.post:nth-child(5) > div:nth-child(3) > div:nth-child(1) > h2:nth-child(1) > a:nth-child(1)")); Assert.assertEquals("Introducción a Selenium 2 y WebDriver", elementResult.getText()); }
Con Conductor así:
@Test public void conductorTest() { //Validación del Título de la página setText("#s", "Selenium" + Keys.RETURN) .validateText("div.post:nth-child(5) > div:nth-child(3) > div:nth-child(1) > h2:nth-child(1) > a:nth-child(1)" , "Introducción a Selenium 2 y WebDriver"); }
Ambos realizan las mismas operaciones, pero es obvio que con Conductor ahorro tiempo y escribo código más legible, porque me centro en la operación a realizar y no en el cómo.
Para enviar el texto con WebDriver instancié WebDriverWait, esperé a que el elemento sea visible, limpié su contenido y envié el texto para la búsqueda. Con Conductor bastó llamar a setText indicando el selector CSS y el texto a enviar.
Para comprobar el resultado de la búsqueda, con WebDriver esperé a la aparición del elemento, y comprobé el contenido del texto del elemento contra el resultado esperado. Con Conductor fue suficiente poner un validateText con el selector y el texto esperado a continuación del setText().
5. Conclusiones
Conductor facilita la escritura de tests con Selenium. Localizar elementos por su selector CSS hace los tests más concisos y permite centrar nuestra atención en qué queremos hacer y no en cómo. Os recomiendo que reviséis la API de Conductor para ver las opciones que nos ofrece el framework.