martes, 31 de agosto de 2010

Tests con Selenium




Resumen:

  • Usando Selenium crearemos un test  en Java  para probar nuestra aplicación web.
  • Para facilitar la creación del test usaremos Selenium IDE, un add-on para firefox.
  • Para refinar el test que creemos, nos ayudaremos de XPath Checker, otro add-on para firefox.



Introducción :


Selenium  es un framework que nos permite realizar test sobre aplicaciones web.


Básicamente consta de :


  • Selenium Remote Control 
Es una herramienta que nos permite escribir tests en diferentes lenguajes de programación para acceder a sitios web.
Consta de dos partes :

       - Servidor  (Remote Control Server ), encargado de lanzar y controlar los navegadores sobre los que se realizan los tests.

       - Librerías clientes para los diferentes lenguajes de programación

  • Selenium IDE 
Es un add-on para Firefox que nos permite grabar ( y posteriormente reproducir ) la actividad que hagamos en Firefox (clicks, entrada de texto, etc. )





XPath Checker es un add-on para Firefox que nos permite ver la ruta XPath de un determinado elemento de la página





Creando y ejecutando tests

Una vez tengamos instalados los plugins. Abrimos Firefox y en el menú "Herramientas" abrimos Selenium IDE



Aparecerá la ventana del Selenium IDE


Volvemos a la ventana del navegador y navegamos por nuestra aplicación. En este ejemplo he usado la demo de Loom. Las acciones que vayamos realizando se irán registrando en la ventana de Selenium IDE. 


Una vez finalizada la navegación exportamos lo capturado por Selenium IDE como un test JUnit de java a través de la opción de menú "Export Test Case As..." 


El código generado :
package com.example.tests;
import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;

public class Untitled extends SeleneseTestCase {
 public void setUp() throws Exception {
  setUp("http://change-this-to-the-site-you-are-testing/", "*firefox");
 }
 public void testUntitled() throws Exception {
  selenium.open("/loomdemo/mortgages/");
  selenium.click("link=Customers");
  selenium.waitForPageToLoad("30000");
  selenium.click("//div[@id='main']/div[1]/a");
  selenium.waitForPageToLoad("30000");
  selenium.type("customer.firstName", "Ernesto");
  selenium.type("customer.lastName", "Hernández");
  selenium.type("customer.idCard", "11111");
  selenium.type("prices[EUROPE]", "1000");
  selenium.type("prices[ASIA]", "1000");
  selenium.type("prices[AMERICA]", "1000");
  selenium.click("customer.creditType0");
  selenium.type("customer.password", "miPassword");
  selenium.type("confirmPassword", "miPassword");
  selenium.click("//input[@value='save']");
  selenium.waitForPageToLoad("30000");
 }
}


Modificamos el código para especificar en setUp() nuestro servidor (localhost:8080).

public class LoomDemoTest extends SeleneseTestCase
 ...
 setUp("http://localhost:8080/", "*firefox");

Listo, ya tenemos nuestra clase de test que podremos ejecutar cuando tengamos arrancado el Servidor de Selenium. En nuestro proyecto el arrancar el servidor Selenium lo podremos hacer por ejemplo usando un plugin de maven, aunque también lo podemos arrancar a mano.


$ java -jar target/dependency/selenium-server-1.0.1-standalone.jar


Una vez ejecutemos el test, se abrirán dos ventanas del navegador, una en donde irá apareciendo información sobre la ejecución del test




Y otra con el resultado del test ( nuestra aplicación )




Refinando los tests


En algunas ocasiones puede ser que necesitemos refinar nuestro test.
Supongamos que mientras grabábamos el test hicimos click en  el primer item del listado:


el código generado por Selenium IDE puede ser algo como:
selenium.open("/loomdemo/customers/list");
selenium.click("link=1 - in conguealiquet (ID: 5158319217)");
selenium.waitForPageToLoad("30000");

En donde vemos que se indica que haga click en el link con el texto "1 - in conguealiquet ... "
Un problema que puede ocurrir es que ese texto varíe ( datos de ejemplo ). 


En lugar de esto tal vez nos interesa especificar que haga click "en el primer elemento del listado". Para ello sustituiremos la expresión que le pasamos por parámetro al método click por otra ruta XPath.


Para calcular la ruta XPath del primer item del listado, sobre el enlace en concreto, haremos click con el botón derecho del ratón y seleccionamos "View XPath". Se nos abrirá la ventana del XPath con la ruta XPath del elemento seleccionado:

Usando el campo XPath podemos realizar búsquedas en la página, de esta forma podemos ver que además de la ruta que nos da por defecto  "id('main')/div[2]/ul[2]/li[1]/a" vemos que también nos sirve la ruta "//ul[2]/li[1]/a" . 

Podemos usar esta herramienta para comprobar rutas XPath. Por ejemplo :

 //div[@id="menu"]






Retomando nuestro test, podemos ahora sustituir  
selenium.click("link=1 - in conguealiquet (ID: 5158319217)");


por


selenium.click("//ul[2]/li[1]/a");



Con lo que nuestro test ahora siempre seleccionará el primer item de la lista independientemente del texto que contega.



3 comentarios:

  1. tengo problemas al ejecutar una prueba, en un campo de texto la información que se ingresa a través de la prueba automatizada desaparece, pero solo en ese campo, en los demas no hay problemas

    ResponderEliminar
  2. import com.thoughtworks.selenium.*;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import java.util.regex.Pattern;

    @Deprecated
    public class Representantes extends SeleneseTestCase {
    @Before
    public void setUp() throws Exception {
    selenium = new DefaultSelenium("localhost", 4444, "*iexplore", "mi aplicacion");
    selenium.start();
    }

    @Test
    public void testRepresentantes() throws Exception {
    selenium.open("/");
    selenium.type("id=txtUsuario_I", "oper");
    selenium.type("id=txtPassword_I", "sqa2011");
    selenium.click("id=btnAcceder");
    selenium.click("name=btnAcceder");
    selenium.waitForPageToLoad("3000000");
    // selenium.open("/Paginas/Captacion/Cotizacion/Cotizacion.aspx");
    selenium.click("link=Representantes");
    selenium.waitForPageToLoad("30000");
    selenium.click("css=#ctl00_HeaderContent_ASPxRoundPanel3_btnAgregar_CD > table > tbody > tr > td");
    selenium.click("name=ctl00$HeaderContent$ASPxRoundPanel3$btnAgregar");

    selenium.type("id=ctl00_HeaderContent_ASPxRoundPanel3_txtrut_I", "13201205");
    selenium.type("id=ctl00_HeaderContent_ASPxRoundPanel3_txtdigv_I", "9");
    selenium.type("id=ctl00_HeaderContent_ASPxRoundPanel3_txtname_I", "Fernando Chamorro");
    selenium.click("id=ctl00_HeaderContent_ASPxRoundPanel3_ddlcomuna_B-1");
    selenium.type("id=ctl00_HeaderContent_ASPxRoundPanel3_txtdireccion_I", "Las Urbinas 73");
    selenium.type("id=ctl00_HeaderContent_ASPxRoundPanel3_txtnacionalidad_I", "chilena");
    selenium.click("id=ctl00_HeaderContent_ASPxRoundPanel3_dtescritura_B-1Img");
    selenium.type("id=ctl00_HeaderContent_ASPxRoundPanel3_txtprofesion_I", "Abogado");
    selenium.click("id=ctl00_HeaderContent_ASPxRoundPanel3_dtescritura_DDD_C_PYCImg");
    selenium.click("id=ctl00_HeaderContent_ASPxRoundPanel3_dtescritura_DDD_C_PYCImg");
    selenium.click("id=ctl00_HeaderContent_ASPxRoundPanel3_dtescritura_DDD_C_PYCImg");
    selenium.click("id=ctl00_HeaderContent_ASPxRoundPanel3_dtescritura_DDD_C_PYCImg");
    selenium.click("id=ctl00_HeaderContent_ASPxRoundPanel3_dtescritura_DDD_C_PYCImg");
    selenium.click("id=ctl00_HeaderContent_ASPxRoundPanel3_dtescritura_DDD_C_PYCImg");
    selenium.click("css=#ctl00_HeaderContent_ASPxRoundPanel3_btnEditar_BTC > span");
    selenium.click("name=ctl00$HeaderContent$ASPxRoundPanel3$btnEditar");
    }

    @After
    public void tearDown() throws Exception {
    selenium.stop();
    }
    }

    ResponderEliminar
  3. selenium.type("id=ctl00_HeaderContent_ASPxRoundPanel3_txtrut_I", "13201205");

    este es el campo que se borra la informacion, estoy trabajando con windows 7, una aplicacion que esta hecha para internet explorer 8, esta hecha en .net con c#

    ResponderEliminar