Primero, vamos a configurar en Eclipse un proyecto Java para ejecutar nuestra clase de prueba. Ve a Archivo -> Nuevo -> Otro… y elige Maven Project:
En la siguiente ventana, marque la opción Crear un proyecto simple (saltar la selección del arquetipo) y haga clic en Siguiente :
En la siguiente ventana, introduzca la información del proyecto, por ejemplo:
Identificación del grupo: com.ejemplo
Identificación del artefacto: selenio
Versión: 0.0.1-SNAPSHOT
Embalaje: tarro
Esto creará un proyecto con un archivo pom.xml y los siguientes directorios:
1234src/main/javasrc/main/resourcessrc/test/javasrc/test/resources
xml
Abra el archivo pom.xml y modifíquelo para que se vea así:
12345678910111213141516171819202122232425262728<projectxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion 0</modelVersion(());com.ejemplo</groupId();<artifactId();selenio(();/artifactId();0.0. 1.21</versión&&t;alcances&t;/alcances&&dependencia&&t;/dependencias&t;/proyecto&t;
xml
Estamos añadiendo las dependencias para el marco de pruebas (JUnit), Selenio y la Biblioteca de Ayudantes de Sauce Java, que actualizará su tablero de Sauce Labs en tiempo real con información sobre las pruebas que está realizando.
Guarda el archivo y si las dependencias de Maven no se añaden automáticamente al proyecto Eclipse, haz clic con el botón derecho del ratón en el nombre del proyecto y elige la opción Maven -> Actualizar proyecto… .
A continuación, copie el archivo exportado de la sección anterior en el directorio src/test/java. Debería compilar con advertencias pero no con errores:
Por último, haga clic con el botón derecho del ratón en la clase, elija la opción Run As -> JUnit Test , y vea cómo se ejecuta la prueba:
Ahora vamos a explicar en detalle lo que hace el código.
El método setup(), que se ejecuta antes de cada método de prueba, instancializa el controlador y establece la URL base y el intervalo de tiempo de espera para la prueba:
123456@Beforepublic evita el lanzamiento de Up()Exception{ driver =newFirefoxDriver(); baseUrl ="http://eherrera.net/"; driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);// 30-second timeout}
java
El método tearDown(), que se ejecuta después de cada método de prueba, cierra el conductor. Si se ha detectado algún error durante la prueba, la prueba falla explícitamente:
12345678@Después de que PublicvoidtearDown()lanzaException{ driver.quit();// el conductor cierraVerificación de la cuerdaErrorString = verificationErrors.toString();if(!"".equals(verificationErrorString)){fail(verificationErrorString);// la prueba falla explícitamente}}
java
Ahora vamos a explicar el método testSampleTestCaseWebdriver(). Primero abre la página web a probar:
1driver.get(baseUrl +"/markdowntutorial/tutorial/emphasis.html");
java
Este método es comparable al comando IDE de Selenio:
1open /markdowntutorial/tutorial/emphasis.html
La siguiente línea encuentra un botón por su clase de CSS y realiza un clic:
1driver.findElement(By.cssSelector("button.button-primary.button-next")).click();
java
Y luego verifica (en realidad, afirma ) que el botón que muestra la respuesta está presente:
&lt;pre&gt;12345try{assertTrue(isElementPresent(By.id(&quot;btn_answer_1-1&quot;));}catch(Error e){ verificationErrors.append(e.toString()); /** afirmación: si no hay respuesta, se lanza un error */}&lt;/pre&gt;
java
De nuevo, compara esas líneas con los comandos del IDE de Selenio:
&lt;pre&gt;12clic css=botón.botón-primario.botón-nextverifyElementPresent id=btn_answer_1-1&lt;/pre&gt;
Fíjense que el paso de prueba se implementa usando una afirmación y una captura de prueba. Recuerde que cuando un aserto falla, la prueba es abortada; cuando una verificación falla, el fallo es registrado y la prueba continúa.
Además, assertTrue() utiliza este método para saber si un elemento está presente:
&lt;pre&gt;12345678privatebooleanisElementPresent(By by){try{conductor.findElement(by);returntrue;}catch(NoSuchElementException e){returnfalse;}}&lt;/pre&gt;
java
A continuación, despejamos el cuadro de texto en el que introducimos la respuesta al ejercicio:
&lt;pre&gt;1driver.findElement(By.id(&quot;editor_1-1&quot;)).clear();&lt;/pre&gt;
java
Y luego, con el método sendKeys(), introducimos algún texto:
&lt;pre&gt;1driver.findElement(By.id(&quot;editor_1-1&quot;)).sendKeys(&quot;El video musical de la canción **American Oxygen** de Rihanna&apos;describe varios momentos de la historia americana, incluyendo la inauguración de Barack Obama.&quot;);&lt;/pre&gt;
java
Aquí&apos;tar el comando IDE de Selenio que realiza la misma tarea:
&lt;pre&gt;1type id=editor_1-1 El video musical de la canción **American Oxygen** de Rihanna&apos;tica representa varios momentos de la historia americana, incluyendo la inauguración de Barack Obama.&lt;/pre&gt;
Puede que se pregunte por el comentario:
&lt;pre&gt;1// ERROR: Excepción atrapada [ERROR: Comando no soportado [fireEvent | id=editor_1-1 | keyup]]&lt;/pre&gt;
java
A diferencia del IDE de Selenio, WebDriver no soporta el comando fireEvent porque sendKeys() dispara los eventos como si el texto se hubiera introducido manualmente.
La verificación de esta acción se hace de esta manera:
&lt;pre&gt;12345try{assertTrue(isElementPresent(By.xpath(&quot;//body/div[5]&quot;)));}catch(Error e){ verificationErrors.append(e.toString());// otra afirmación, ya que se lanza un error}&lt;/pre&gt;
java
Por último, la clase tiene dos métodos que no se utilizan en esta prueba:
&lt;pre&gt;1234567891011121314151617181920212223privatebooleanisAlertPresent(){try{ driver.switchTo().alert();returntrue;}catch(NoAlertPresentException e){returnfalse;}}privateStringcloseAlertAndGetItsText(){try{Alert alert = driver. switchTo().alert();String alertText = alert.getText();if(acceptNextAlert){ alert.accept();}else{ alert.dismiss();}return alertText;}finally{ acceptNextAlert =true;}}&lt;/pre&gt;
java
Ahora vamos a tomarnos un momento para hablar de un concepto importante: las formas en que el Selenio localiza los elementos usando findElement() y los métodos de la clase By.
Puedes usar las siguientes etiquetas como localizadores:
- IDENTIFICACIÓN. Esta es la mejor manera de localizar un elemento porque una identificación debe ser única. Desafortunadamente, o esto no siempre es cierto o no todos los elementos tienen una identificación.
- Nombre de la clase. Más de un elemento puede usar el mismo nombre de clase CSS, por lo que es mejor usar findElements() (que devuelve una lista de elementos coincidentes) en lugar de findElement() (que devuelve el primer elemento coincidente encontrado).
- Enlace de texto. Esto encuentra un enlace con el texto exacto en él.
- Texto de enlace parcial. También utiliza el texto de un enlace, pero en este caso, se puede utilizar un comodín.
- Nombre. Esto encuentra todos los elementos con un atributo de nombre dado.
- Nombre de la etiqueta. Esto encuentra todos los elementos de una etiqueta dada, como div o p.
- Selector de CSS. Esto busca elementos que coincidan con un selector CSS, como #container &amp;gt; img.
- Expresión XPath. Esta busca elementos que coincidan con una consulta XPath, tales como //body/ul[@class=&apos;container&apos;]/li.
Cuando se usan selectores CSS o expresiones XPath, se pueden usar rutas absolutas :
&lt;pre&gt;1driver.findElement(By.xpath(&quot;/html/body/div[1]/img[2]&quot;));&lt;/pre&gt;
java
Sin embargo, no se recomienda el uso de caminos absolutos ya que un solo cambio en una parte del camino puede romper toda la expresión. Es mejor usar caminos relativos .
Crear un camino relativo obteniendo primero el padre más cercano y luego el elemento hijo, por ejemplo:
123WebElement div = driver.findElement(By.className("container"));List<WebElements> imgs = div.findElements(By.tagName("img));WebElement img =(imgs.size()>=2)? imgs.get(1):null;
java
Volvemos a analizar el código producido por el IDE de Selenio (y en general, por cualquier herramienta de grabación/reproducción). Puedes ver que nuestro código presenta algunos problemas:
- Los datos de la prueba y nuestros localizadores están codificados.
- No podemos decir que la calidad del código sea alta.
- El código resultante es una copia idéntica de la grabación, así que nuestra prueba no es flexible.
- Al tener acciones de los usuarios y afirmaciones (verificaciones) en la misma clase, estamos violando el Principio de Responsabilidad Única.
Por esas razones, se recomienda usar los scripts de herramientas como Selenium IDE sólo como puntos de partida. Lo que se puede hacer es registrar la interacción del usuario, añadir afirmaciones y verificaciones, comprobar que el script funciona correctamente y luego exportar el script como código fuente.
Una vez que tengas el código fuente de la prueba, puedes hacer ajustes para crear pruebas mejor diseñadas. Una técnica para lograr esto es el patrón del Objeto de Página, que discutiremos en la siguiente sección.