Tutorial Selenium: Primeros pasos

Tutorial Selenium: Primeros pasos

En el mundo del desarrollo software es muy importante no olvidarse nunca de la fase de pruebas. Este tema lo ha escuchado un desarrollador durante toda su vida laboral: desde que empezó a estudiar, hasta que se jubila, pasando por artículos como este; y seguirá siendo así durante muchos tiempo, ya que es la forma de mantener un mínimo de calidad en el desarrollo de cualquier software. En este artículo, nos centraremos en un caso concreto. Se trata de una aplicación aplicación web, desarrollada en cualquier lenguaje. El objetivo es probar la interfaz de usuario, es decir, comprobar cada enlace va a donde tiene que ir y cada botón hace lo que se supone que tiene que hacer. Para esto vamos a utilizar la herramienta Selenium.

El concepto

En el siguiente apartado se explicará cómo descargar e instalar la última versión de la herramienta, pero en este se intentará explicar cómo funciona Selenium WebDriver. La idea es muy sencilla. Selenium proporciona al desarrollador un API que le permitirán interactuar con la página que se desea probar. Es decir, un primer paso sería proporcionarle una url a la página que se desea probar. A continuación, podemos ir buscando y seleccionando los elementos que sabemos que existen la página que indicamos al principio. Por ejemplo, se podría buscar un enlace con id «siguiente-pagina» y luego simular un clic en dicho enlace. Este proceso se realizará en cualquiera de los lenguajes compatibles (los ejemplos los veremos en Java). Al ejecutarlo, veremos como en nuestra pantalla se abre un navegador y, sin tocar nada, se van realizando las acciones que se han programado previamente. A partir de aquí, las pruebas se pueden complicar todo lo que se quiera. Es posible navegar entre páginas, rellenar formularios, comprobar el css, etc.

Instalación

En la página de descargas, se puede escoger la instalación que más convenga a cada uno: http://docs.seleniumhq.org/download/ Nosotros vamos a simplificar lo máximo. Crearemos un projecto Java usando Maven e indicaremos la siguiente dependencia en el pom.xml

1
2
3
4
5
<dependency>
   <groupId>org.seleniumhq.selenium</groupId>
   <artifactId>selenium-java</artifactId>
   <version>2.48.2</version>
</dependency>

Una vez hecho esto, el siguiente paso es comenzar a programar los tests.

Drivers

Selenium ofrece varios navegadores para ejecutar las pruebas. Para cada uno de ellos proporciona un Driver. De esta forma existen los siguientes: ChromeDriver, FirefoxDriver, OperaDriver, AndroidDriver e iOSDriver. Si deseáramos utilizar un navegador que no estuviera instalado en nuestro equipo, pero sí en uno remoto, sería necesario utilizar simultáneamente las herramientas Selenium-Server y Selenium-WebDriver.

Creación de pruebas

Veamos ejemplos algunos ejemplos concretos. En primer lugar, empecemos creando una clase con un main, la cual será la encargada de ir ejecutando los diferentes comandos de Selenium. Ahora, lo que hace falta, es crear un driver. Si queremos ejecutar las pruebas en Firefox, bastaría con la siguiente sentencia para tener el control sobre una instancia del navegador:

1
WebDriver driver = new FirefoxDriver();

El siguiente paso, sería abrir la url con la que queremos empezar a realizar pruebas. Sería tan sencillo como indicárselo al driver de la siguiente forma:

1
driver.get(URL);

Es recomendable también, tener a nuestra disposición una instancia de la clase Selenium, ya que nos permitirá el acceso posterior a métodos muy interesantes. Para esto, la podemos recuperar de la siguiente manera:

1
Selenium s = new WebDriverBackedSelenium(driver, URL);

A partir de este momento, es recomendable que se tenga nuestra web modelada, de tal forma que, para cada página de la web, exista una clase que la represente. Esta clase, contendrá los métodos que nos hacen falta para las pruebas dentro de esa página. Pongamos un ejemplo. Es de esperar que la primera página a la que se tenga que acceder, sea la página de login de nuestra web. Se crearía entonces, una clase (LoginPage) que, como mínimo, tendría el método login(user, pass). De esta forma, desde nuestro main, llamaríamos a ese método con los datos que se deseen. Pero, ¿cómo se instancia la página de login? Nos ayudaremos de la factoría que nos proporciona Selenium:

1
LoginPage loginPage = PageFactory.initElements(driver, LoginPage.class);

Con lo cual, el código completo que tendremos en este punto será:

1
2
3
4
5
WebDriver driver = new FirefoxDriver();
driver.get(URL);
Selenium s = new WebDriverBackedSelenium(driver, URL);
LoginPage loginPage = PageFactory.initElements(driver, LoginPage.class);
loginPage.login("user1", "pass123");

Es necesario destacar que LoginPage deberá tener un constructor que acepte un driver para poder utilizar la factoría de la forma que se indicó arriba. Además, para poder utilizar la clase Selenium, también podría haber un setter, pero esto ya queda a elección de cada uno. Antes, decíamos que era interesante porque proporcionaba algunos métodos interesantes. En concreto, waitForPageToLoad permitirá crear una pausa mientras la página que se está accediendo termina de cargarse por completo. Esto es necesario porque podríamos estar buscando un elemento dentro de la página y éste no existiera debido a que no terminó de cargar la página. El resultado sería una excepción de Selenium y el programa pararía. Siguiendo con el ejemplo, ahora es necesario implementar el método login. Los pasos serían los siguientes: – esperar a que cargue la página – buscar el input para meter el usuario e introducirlo – buscar el input para meter la contraseña e introducirla – enviar el formulario – redirigir a la nueva página (suponiendo que los datos son correctos)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public HomePage login(String username, String password) {
 
        getSelenium().waitForPageToLoad(WAIT_FOR_PAGE_TO_LOAD_TIMEOUT);
 
        WebElement username = getDriver().findElement(By.id("user"));
        username.sendKeys(username);
 
        WebElement username = getDriver().findElement(By.id("pass"));
        password.sendKeys(password);
 
        this.username.submit();
 
        HomePage page = new HomePage(driver, getSelenium());
        return PageFactory.initElements(driver, page);
}

Si se desea probar la web ante un login incorrecto, en vez de redirigir a la nueva página, habría que comprobar que aparece el mensaje de error correspondiente. Expliquemos un poco el método anterior. Como se puede ver, se está utilizando el método waitForPageToLoad para esperar a que la página termine de cargar. A continuación, se busca el input concreto para poder introducir el usuario. Esto se hace gracias al método findElement, que acepta un argumento de tipo By. Este argumento permite indicar cómo es posible encontrar el elemento deseado. En este caso, se está diciendo que el elemento que queremos tendrá un id igual a «user». El mismo proceso se hace para la contraseña y, finalmente, se envía el formulario con el método submit. También sería posible buscar el botón de login e invocar al método submit. Por último, como estamos suponiendo que las credenciales son correctas, se espera que nuestra web nos redirija a una nueva página y, por lo tanto, nuestro login devolverá una instancia a esa nueva página. Obsérvese que este paso se está realizando de una forma un poco diferente. Así, podemos ver cómo se haría en el caso de que la nueva página necesitase indicarle más argumentos en el constructor.

Buscar elementos

En el apartado anterior se han visto ya bastantes conceptos que permiten ponerse a codificar las pruebas. Ahora, simplemente vamos a dar una serie de pistas para aumentar un poco la complejidad de los tests. Veíamos cómo buscar un elemento por id, pero ¿qué pasa si el elemento que deseamos recuperar no tiene id? La clase By nos ofrece varios métodos diferentes para la búsqueda de elementos. Algunos de los más interesantes son: – By.className(): permite la búsqueda por clase (atributo class) – By.cssSelector(): permite recuperar elementos siguiendo la sintaxis de selectores de css. Por ejemplo: «div > .btn» – By.xpath(): localiza elementos que cumplan la expresión XPath que se indique Este último método quizá es el más potente de todos, ya que permite construir cualquier expresión XPath. Por ejemplo, con la expresión «//table[@class=\»search-results-table\»]/tbody/tr/td[3]», se estará recuperando la tercera columna de todas las filas de la tabla con clase igual a «search-results-table».

Conclusión

El propósito de este artículo era introducir los conceptos básicos de Selenium para crear una batería de pruebas mínimamente elaborada. Quedan, sin embargo, muchos elementos y muchas opciones de Selenium por analizar. Por ejemplo, la clase WebElement, ofrece nuevas posibilidades para comprobar los resultados obtenidos, así como más opciones de interacción con la interfaz. Esperamos que haya servido de ayuda y que ahora vuestra aplicación haya mejorado en fiabilidad y calidad.

Publicado en julio 14, 2014

,

,

28 comentarios en Tutorial Selenium: Primeros pasos
  1. Manuel dice:

    Una consulta, quiero abrir el navegador Firefox pero el driver que abre esta por defecto en ingles, pero lo necesito en español, alguno sabe como hacer para que lo abra en español??.

    Gracias

    • cperez dice:

      Hola Manuel,

      Puedes configurar el driver de Firefox de la siguiente manera:

      FirefoxProfile profile = new FirefoxProfile();
      profile.setPreference(“intl.accept_languages”,”es”);
      driver = new FirefoxDriver(profile);

  2. Balero dice:

    Manuel,

    Soy principiante en este tema y quisiera saber como ejecutar el código, solo necesito instalar Web driver, o si tienes algún tutorial de como ejecutar este código.

    Saludos

    • cperez dice:

      Hola Balero,

      Lo primero que debes hacer, es declarar las dependencias de Selenium en tu proyecto. En el artículo, se muestra un ejemplo de cómo hacerlo si usas Maven.

      Después, es tan sencillo como ejecutar tu código en un simple main

      Saludos.

  3. Karen dice:

    Buenas Tardes.
    Soy novata usando selenium, quisiera saber cual de las plataformas de selenium trabaja directamente con código Java.
    En los articulos que estuve leyendo se que es Selenium Webdriver, pero lo que no entiendo es como acoplar con mi myelipse para poder realizar mis pruebas, sin tener que usar Maven.

    La idea es realizar unas pruebas de códigos básicamente, se podría descargar el plugin de selenium dentro del myeclipse y ejecutar mis pruebas o necesito realizar alguna configuración más detallada.

    Agradeceria su respuesta, en vista que tengo que elaborar una documentación con respecto a esta herramienta de testing. Y no la comprendo muy bien.

    Saludos.

    • cperez dice:

      Hola, Karen,

      Si no usas Maven, entonces deberás descargarte Selenium e incluirlo en el classpath de tu proyecto como cualquier otra librería.

      Espero haberte ayudado

  4. Karen dice:

    Hola.
    Comprendo, de hecho tengo instalado maven dentro de myeclipse lo que me gustaria saber es si efectivamente es selenium webdriver el que se utiliza para realizar pruebas en código java y como integrarlo dentro del proyecto

    Necesito elaborar un manual de instalación sobre la herramienta pero la desconozco totalmente, vos realizas pruebas con esta herramienta.

    Gracias por la info.

    • cperez dice:

      Sí, es Selenium Webdriver lo que necesitas. Si usas Maven, añade la dependencia a tu pom.xml y ya puedes comenzar a programar las pruebas sin ninguna configuración a mayores.

      • Karen dice:

        Buenos días.
        Ayer estuve leyendo sobre maven cuenta una opción para descargar las dependencias, comprendo que es en esa opción donde ingresas el nombre de la herramienta selenium y automaticamente el myeclipse te descarga la libreria de la herramienta.

        Entiendo que para usar selenium la liberia que se tiene que descargar es la selenium-firefox-driver, y además configurar en el pom.xml.

        org.seleniumhq.selenium
        selenium-server
        2.0b2
        test

        junit
        junit
        4.8.2
        test

        este es el ejemplo que encontre y queria saber si es realmente de esta manera que se configura selenium webdriver en maven.

        Muchas gracias

        • cperez dice:

          Buenos días, Karen,

          Te recomiendo seguir los pasos que se indican en el artículo. En el pom.xml debes incluir la dependencia que se indica más arriba:

          org.seleniumhq.selenium
          selenium-java
          2.48.2

          Haciendo eso, Maven se descargará automáticamente la nueva dependencia e incorporará la librería a tu proyecto.

          Saludos

          • Karen dice:

            Buenas Noches.
            Te comento que hice lo que el manual de instrucciones me indicaba dentro del pom.xml agregue la dirección de selenium para que me descargue la libreria.
            Pero cuando quise ejecutar las pruebas dentro de un proyecto base no me basico que es el Hello Word para probar si me reconocia las liberias de selenium me arrojo un error me refiero a esta:
            import org.openqa.selenium.Webdriver;
            import org.openqa.selenium.firefox.FirefoxWebdriver;

            También tengo una consulta en cuanto a maven dentro de mi proyecto no me aparecen la opción de Maven Dependencies, por lo que lei en una manual se tiene que configurar el apache de maven, lo que no se si eso tiene que ver con la configuración que dentro de maven me aparezca esa opción que te comente.

            Saludos

  5. Silvana dice:

    Hola, con que versión de firefox hiciste el tutorial? que versiones de firefox soporta selenium 2.48.2?

    • cperez dice:

      Hola Silvana,

      Lamentablemente no disponemos de ese dato. Sin embargo, si consultas la documentación de Selenium, puedes ver los navegadores compatibles: http://docs.seleniumhq.org/docs/01_introducing_selenium.jsp#supported-browsers-and-platforms

      Como puedes ver, cada versión de Selenium soporta la versión en curso de Firefox y la inmediatamente anterior.

      En cualquier caso, Selenium va por la versión 2.53.0, por lo que te recomiendo esta versión y de esa forma también tienes la garantía de que funciona con la última versión de Firefox

      Saludos

  6. jose lozano dice:

    Hola, soy principiante me gustaría saber si con selenio puedo realizar peticiones internas como eventos onclick o submit y descargar un pdf? Y si existe alguna documentación o ejemplo seria muy grato conocerlo. Gracias por su ayuda.

    Nota: podrían indicarme como hacerlo o en su efecto proporcionar documentación. SALUD2

    • cperez dice:

      Hola Jose,

      Sí, con Selenium es posible realizar lo que comentas. En general, podrás simular cualquier evento.

      Más arriba, en el artículo, puedes ver cómo configurar Selenium y un ejemplo sencillo para hacer submit de un formulario de login. También puedes encontrar toda la documentación en la web oficial: http://www.seleniumhq.org/docs/

  7. Sergio dice:

    Hola
    Soy tester manual y me gustaría aprender a realizar pruebas automatizadas con Selenium, de casualidad tendrás algún tutorial que me enseñe desde cero?

    Saludos!!

    • cperez dice:

      Hola, Sergio,

      Si tu proyecto es en Java, te animo a que leas detenidamente el artículo para entender cómo funciona Selenium y realizar los primeros tests. Si necesitas información más detallada, puedes consultar la documentación oficial en http://docs.seleniumhq.org/docs/

  8. Yeni dice:

    Buenos días, necesito de su colaboración.
    Estoy configurando todas las herramientas para realizar pruebas automatizadas con Selenium Webdriver, ya instalé todo y creé en el Maven las dependencias tal cual usted refiere. Al compilarlo me sale el siguiente error en el Maven:
    Multiple annotations found at this line:
    – Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (execution: default-compile,
    phase: compile)
    – CoreException: Could not calculate build plan: Plugin org.apache.maven.plugins:maven-compiler-plugin:2.3.2 or one of its dependencies could not be
    resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-compiler-plugin:jar:2.3.2: ArtifactResolutionException: Failure to transfer
    org.apache.maven.plugins:maven-compiler-plugin:pom:2.3.2 from http://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not
    be reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact org.apache.maven.plugins:maven-
    compiler-plugin:pom:2.3.2 from/to central (http://repo.maven.apache.org/maven2): connection timed out to http://repo.maven.apache.org/maven2/org/apache/
    maven/plugins/maven-compiler-plugin/2.3.2/maven-compiler-plugin-2.3.2.pom
    – Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-compiler-plugin:2.3.2:testCompile (execution: default-
    testCompile, phase: test-compile)

    Por favor me podría ayudar? gracias…y saludos

  9. Manuel dice:

    Estimado, buen dia, estoy comenzando con esto de automatizar y tengo algunas dudas, te las enumero para que a efectos de tus comentarios te sea mas facil;
    1-. Si yo genero una prueba con el IDE desde firefox y luego quiero exportarla a lenguaje Java, el codigo generado es poco robusto? se generan muchas inconsistencias?
    2-. Al estar ya en el IDE de Java (Netbean) observo que se crearon puros metodos, no veo main por ningun lado, pregunto, debo crear yo un main e invocar esos metodos para correr la prueba desde netbean o como haria para ejecutar la prueba estando ya en codigo java?
    3-. Debo cargar las dependencias de Seleniun en cada proyecto que trabaje en Netbean?
    4-. Finalmente, y me disculpo por el desconocimiento, yo puedo automatizar de cuantas maneras? es decir, con el plug de firefox grabaria (seria la primera forma), con un IDE tipo netbean tambien pudiera generar las pruebas a punta de codigo (seria la segunda), pero de que otra forma podria? existe algun IDE propio de Seleniun por ejemplo para ver el codigo y editarlo sin que sea en la simple ventana del plug? de ser asi de donde lo puedo bajar?

    Mil gracias y disculpa de nuevo si son preguntas jaladas por los pelos…jeje.

    • Ana dice:

      Hola Manuel, también soy nueva en Selenium.
      Creo que no es una buena practica tomar el código de IDE para pruebas en Webdriver (sin embargo no estoy muy segura de eso)
      No es necesario main, es necesario la etiqueta @test encima de cada método que represente una prueba

      Te pego por lo menos la estructura que yo tengo (lo estoy haciendo a pata):
      public class PriceCategoryReport {
      public WebDriver driver;
      @BeforeTest
      public void setup() throws InterruptedException {
      CODIGO BEFORE TEST
      }
      @Test (priority = 1)
      public void verificarCargadeTabla() {
      CODIGO PRUEBA
      }
      }

    • Julian Novoa dice:

      Hola Manuel, espero no sea muy tarde para intentar solucionar o ayudar en tus dudas…

      1. Como dice Ana, no es muy buena practica exportar el codigo de Selenium IDE a un lenguaje y trabajar con ello, sugiero inicies tus pruebas desde cero con tu IDE favorito. y Sí, se generan varias inconsistencias en las alertas, localizacion de elementos, ventanas popup entre muchas otras.
      2. Las pruebas automatizadas se pueden/deben correr con un framework de pruebas (JUnit o TestNG) se crea una clase tipo @Test y el framework se encarga de ejecutar la prueba, sacarte un log especifico y reportes de la prueba.
      3. Sí, se deben cargar en cada proyecto que crees. Tambien recomiendo que se maneje Maven para las dependencias.
      4. Lo que logro entender… Te explico un poco, Selenium IDE sirve para grabar pruebas desde el navegador. WebDriver para escribir scripts de prueba desde algún lenguaje de programación y existe Selenium Grid para lanzar pruebas en paralelo a diferentes Navegadores/equipos/SO.

  10. Julian Novoa dice:

    Excelente tutorial! muchas gracias por ello.

    Super recomendado!!

  11. Roberto Hernando dice:

    Hola, soy nuevo en Selenium. Tengo un problema. He usado Selenium para meterme en una pagina y queria subir una imagen, pero para subirla me abre el explorador de Archivos de Windows para elegir que imagen. Como puedo hacer para que escoja automaticamenete la imagen que quiero? Gracias

    • cperez dice:

      Hola, Roberto,
      No sé si acabo de entender muy bien tu caso, pero te mando una idea por si te ayuda.

      Arriba poníamos algún ejemplo de cómo rellenar un formulario y enviarlo. De la siguiente forma se busca el elemento html que tiene id «user» y se le asigna un valor:

      WebElement username = getDriver().findElement(By.id(«user»));
      username.sendKeys(«miusername»);

      Imagino que tendrás en el html algún «input type=»file»», con lo cual tan sólo tendrás que asignarle un id («input id=»imagen» type=»file»») y buscarlo de la misma forma que el ejemplo:

      WebElement imagen = getDriver().findElement(By.id(«imagen»));

      Para asignarle la imagen que quieres, también es muy parecido al ejemplo:

      imagen.sendKeys(«ruta_a_la_imagen»)

      Espero haberte ayudado

  12. Julian Novoa dice:

    Buenas tardes,
    Agradezco de antemano esta gran información sobre selenium. Fue todo un gusto leerla.

  13. Alex dice:

    Estimado, actualmente me encuentro automatizando en selenium usando cromedriver en java con el IDE eclipse maven, el punto es que me pidieron incorporar Coordenadas o la geocalizacion para que al momento de acceder a la pagina web en este caso Latam.com, cargue como latam.com.ar.es o algo asi ,segun la ubicacion que se la en las coordenadas. Navegué por todas partes y nadie da una solucion clara a mi problema. Me podrias ayudar, gracias.
    Saludos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

« »