03/12/2022

Introducción a Selenium Testing

COMPARTIR EN:

  • Linkedin Logo
  • Twitter Logo
  • Facebook Logo
  • Mail Logo

En este post se presenta una introducción a la automatización de pruebas con Selenium.

A su vez, se presenta como surgió el conjunto de herramientas, sus ventajas y desventajas, qué tipo de pruebas permite realizar y en qué momento es necesario.

Logo Selenium

¿Qué es Selenium?

Un conjunto de herramientas de pruebas automatizadas de código abierto (también conocido como framework de automatización de pruebas), que proporciona una única interfaz que permite escribir scripts de prueba en varios lenguajes de programación como Java, C#, Ruby, Groovy, Perl, PHP y Python.

Las pruebas pueden ejecutarse usando la mayoría de los navegadores web (Firefox, Chrome, Edge, entre otros), y en diferentes sistemas operativos como Windows y Linux.

Cada una de las herramientas que ofrece Selenium, satisface diferentes necesidades de pruebas de control de calidad, que pueden utilizarse individualmente o combinadas entre sí.

Las herramientas son: Selenium WebDriver, que se utiliza para automatizar pruebas basadas en aplicaciones web; Selenium IDE, implementada como una extensión de algunos navegadores que permite grabar, editar y depurar pruebas. Y por último, Selenium Grid, desarrollada para poder ejecutar pruebas simultáneamente de forma distribuida.

Los inicios de Selenium 

📚 📖  Selenium surgió en el año 2004 en ThoughtWorks con Jason Huggins tratando de construir un framework para probar una aplicación interna de Tiempos y Gastos.

Jason empezó a hacer demostraciones con la herramienta de prueba a varios colegas, pero quedaron motivados con su potencial como framework para utilizarlo en otras aplicaciones web.

Luego de varias demostraciones, Paul Hammant compañero en ThoughtWork, comenzó a debatir sobre el código abierto de Selenium.

Junto con otros colegas, analizan la posibilidad de un componente tipo «servidor». Este servidor actuaría como un proxy HTTP y engañaría a la instancia del navegador para que creyera que el script de prueba y la aplicación web bajo prueba eran de la misma fuente. El mismo es desarrollado en Java, y el controlador del lado del cliente original (TestRunner) se transfiere a Ruby.

En sus comienzos este fue el Selenium original, conocido como Driven Selenium o Selenium B en la línea de tiempo de evolución.

Luego, aproximadamente en 2005, se unieron más personas especialistas en pruebas y programación. Es así que Dan Fabulich y Nelson Sproul, con la ayuda de Pat Lightbody, hicieron una oferta para una serie de modificaciones que transformaron a Driven Selenium en “Selenium Remote Control” (RC).

En el año 2006, Shinya Kasatani se interesó en Selenium y observó que podía envolver el código central en un módulo IDE en el navegador Firefox, grabar  pruebas y reproducirlas en el mismo plugin. 

En 2007, Jason se unió a Google junto con otras personas, como Jennifer Bevan; y continuaron con el desarrollo y la estabilidad de Selenium RC. 

Al mismo tiempo, Simon Stewart de ThoughtWorks desarrolló una herramienta de automatización de navegador superior llamada WebDriver; y en 2009, después de una reunión entre los desarrolladores en una conferencia de Automatización de Pruebas de Google, se decidió fusionar los dos proyectos y llamar al nuevo proyecto Selenium WebDriver o Selenium 2.0.

En 2008, Philippe Hanrigou en ThoughtWorks creó Selenium Grid, que proporciona un centro que permite la ejecución de múltiples pruebas de Selenium simultáneamente en cualquier número de sistemas remotos, minimizando así el tiempo de ejecución de la prueba.

En 2016, Selenium RC queda obsoleto y WebDriver se convierte en una implementación estándar, también conocida como Selenium 3.0.

Ha sucedido mucho más desde entonces, y además de Selenium WebDriver, el proyecto Selenium se ha convertido en un conjunto de herramientas que consta de Selenium WebDriver, Selenium IDE y Selenium Grid.

Selenium Origins

¿Por qué se llama Selenium?

El nombre Selenium proviene de una broma hecha por Jason Huggins en un correo electrónico, burlándose de un competidor llamado Mercury, diciendo que se puede curar la intoxicación por mercurio tomando suplementos de Selenium. Las personas que recibieron el correo electrónico tomaron el nombre como inspiración para bautizar el proyecto.

Herramientas Selenium

A continuación se describe brevemente cada una de las herramientas pertenecientes a Selenium. Las mismas son:

  • Selenium Integrated Development Environment (IDE)
  • Selenium Remote Control (RC) – Obsoleto
  • Selenium WebDriver
  • Selenium Grid

Types of Selenium

1. Selenium IDE

Selenium IDE es un entorno de desarrollo integrado para pruebas. Se encuentra implementado como una extensión de Firefox y Chrome. Esta permite grabar, editar y depurar pruebas. Originalmente se le conoció como Selenium Recorder.

Se pueden desarrollar scripts de pruebas al crear una grabación y de esa manera se puede editar manualmente con sentencias y comandos para que la reproducción de la grabación sea correcta.

Los scripts se generan en Selanese, un lenguaje especial para Selenium que provee comandos que ejecutan acciones sobre objetos en el navegador, como hacer clic en un botón, seleccionar de una lista de opciones, verificar la presencia de un texto, así como para tomar la totalidad de la página producto de las acciones.

2. Selenium Remote Control (RC)

Selenium RC es un sistema cliente/servidor que permite controlar los navegadores localmente, utilizando diferentes lenguajes de programación. 

El mismo fue el framework inicial de todos los proyectos Selenium por mucho tiempo. Es la primera herramienta de pruebas de automatización que permite a los usuarios desarrollar sobre diferentes lenguajes de programación.

Selenium Remote Control también fue conocido como Selenium 1, luego se fusionó con Selenium WebDriver.

3. Selenium WebDriver

Selenium WebDriver es el sucesor de Selenium Remote Control. Es el componente más utilizado de Selenium. El mismo permite a los usuarios escribir su código en distintos lenguajes de programación e interactuar con el navegador seleccionado. WebDriver se compone de un conjunto de APIs que permiten al tester controlar el navegador a nivel del sistema operativo,  las páginas web y sus elementos HTML.

Al ejecutar Selenium WebDriver se levanta una instancia del navegador y ejecuta el script de prueba. Dicha instancia es específica del navegador, por ejemplo, Google ha desarrollado y mantiene ChromeDriver con el objetivo de integrarse a Selenium y dar soporte a la automatización en Chromium/Chrome.

Con Selenium WebDriver también es posible la integración con diferentes librerías, como Cucumber, TestNG o JUnit.

Como se muestra en la figura de arriba, se fusionaron los proyectos de WebDriver y RC, y sus características se incorporaron como una versión 2 de WebDriver que se denominó como Selenium 2.

Luego, Selenium 3 fue una actualización de Selenium 2 con muchas mejoras y nuevas funcionalidades, convirtiéndose en un estándar del World Wide Web Consortium (W3C).

Actualmente, Selenium 4 es la última versión de Selenium, que está disponible para los lenguajes de programación  Java, .Net, Python, Ruby y Javascript.

Esta última versión tiene varias mejoras y características nuevas, como la introducción de los localizadores relativos. En el caso de utilizar algún navegador de Chromium o Firefox se han incluido formas de manejar la autenticación, la intersección de la red y tareas como esperar un cambio en el DOM o proporcionar una forma de ver los errores de Javascript, entre otras.

Selenium permite siete localizadores de objetos diferentes como forma de interactuar con la aplicación web. Esto es importante para la creación de las pruebas automatizadas, siendo posible hacer clic, deslizar e ingresar texto a través de los siguientes localizadores:

Localizadores simples:

  • By.id() – Localizar por el atributo “id” del tag HTML.
  • By.name() – Localizar por el atributo “name” del tag HTML.
  • By.tagName() – Localizar por el nombre de tag (ej: input).
  • By.className() – Localizar por una de las clases CSS del tag
  • By.linkText() y By.partialLinkText() – Localizar por el texto exacto o parcial de un tag a (link).

Localizadores avanzados:

  • By.cssSelector() – Localizar un elemento utilizando un localizador CSS
  • By.xPath() – Localizar un elemento utilizando un XPath

Y por último, como se mencionó anteriormente, se encuentran los nuevos localizadores (“Relative Locators”), donde los mismos son útiles cuando es difícil construir un localizador para un elemento en particular. Entonces, estos localizadores lo que hacen es ubicar a los elementos web en un lenguaje de manera más humana, como “encima de ese elemento” o “a la derecha de este otro elemento”, es decir éstos localizadores toman como argumento para punto de origen una referencia de elemento previamente ubicado o de otro localizador.

Ejemplos:

  • RelativeLocator.with(By.tagName()).above(By.id())
  • RelativeLocator.with(By.tagName()).below(By.id())
  • RelativeLocator.with(By.tagName()).toLeftOfOf(By.id())
  • RelativeLocator.with(By.tagName()).toRightOf(By.id())

4. Selenium Grid

Selenium Grid es un servidor que permite usar instancias de navegador habilitando la ejecución en forma paralela de varias pruebas simultáneas en varias máquinas. 

Es un entorno con múltiples instancias, que contiene un hub y múltiples nodos. El hub es un servidor “master” que controla y se comunica con nodos. Y los nodos son dispositivos remotos donde básicamente se ejecutan los script de pruebas de Selenium. Desde el hub, se envían las instrucciones de ejecución y se puede verificar si todas las aplicaciones de los diferentes sistemas se están ejecutando correctamente. 

Un ejemplo es la herramienta LambdaTest, que dentro de Selenium Grid se utiliza para realizar pruebas en la nube.

Características de Selenium 

👍 Ventajas de Selenium 

Al ser un conjunto de herramientas, Selenium ofrece muchas posibilidades para las pruebas automatizadas, lo que hace posible que encuentre algo que se adapte a su necesidad y forma de trabajo.

Como se mencionó anteriormente, Selenium se puede utilizar en todos los navegadores modernos, como Chrome, Firefox, Safari, Internet Explorer, Opera y Edge. Es compatible con diferentes sistemas operativos como Windows, Linux, Mac OS, UNIX y funciona con múltiples lenguajes de programación. 

El objetivo principal de las pruebas automatizadas es ahorrar tiempo y esfuerzos. Con la ayuda de Selenium Grid, se pueden ejecutar pruebas en paralelo, lo que reduce el tiempo de ejecución de las pruebas.

Además, al ser de código abierto, las herramientas se pueden adaptar según las necesidades de cada usuario y existe una gran cantidad de usuarios que lo utilizan, lo que facilita el aprendizaje  y compartir mejores prácticas.

Por último, también se destacan como otras ventajas:

  • Es gratis, no incluye costos de licenciamiento.
  • Simple de instalar.
  • Tiene mucha capacidad de integración, lo que permite realizar distintas pruebas y reportes en paralelo.
  • Reutilización de código, los script de pruebas se pueden utilizar en diferentes escenarios y navegadores.
  • Cuenta con mucha documentación, tanto oficial como de la comunidad Selenium.

👎 Desventajas de Selenium

Más allá de todas los beneficios y ventajas, también es oportuno mencionar que carece de algunas funcionalidades.

En el caso de automatización de pruebas, tanto en aplicaciones de escritorio como en aplicaciones mobile, se requiere de otros drivers o componentes adicionales.

Por ejemplo, se puede utilizar Appium para aplicaciones que se ejecutan en dispositivos móviles.

Las funcionalidades vinculadas a informes y reportes de datos de las pruebas, solo son posibles mediante integraciones con otras herramientas.

A su vez, se debe considerar el mantenimiento de la infraestructura. La configuración de varios componentes y de Selenium Grid es una tarea que requiere tiempo. Implica un seguimiento continuo, así como las actualizaciones y parches de las mismas.

Otra de sus desventajas, es que se requiere conocimiento de programación para realizar las pruebas. A pesar de ser una ventaja su utilización en varios lenguajes de programación, muchas veces los tester no necesariamente tienen conocimientos de desarrollo, lo que limita su uso.

Tipos de pruebas con Selenium

A continuación se detallan los diferentes tipos de pruebas que se pueden automatizar con Selenium:

✅  Dentro de las pruebas funcionales, se encuentran las pruebas de UI; y para automatizar las pruebas, Selenium controla de forma remota las instancias de los navegadores, obteniendo los elementos de la interfaz gráfica de usuario y así poder simular tareas o interacciones, como completar campos, seleccionar una opción de campos desplegables, hacer clic en botones, entre otros.

✅  Las pruebas de regresión, aseguran que no se introduzcan efectos secundarios en las funcionalidades de una aplicación cuando el código cambia, o cuando se introducen nuevas funcionalidades en la aplicación. Las pruebas automatizadas facilitan mucho este tipo de pruebas, ahorrando tiempos en la liberación de nuevas versiones.

✅  Las pruebas de compatibilidad garantizan que la aplicación web cumpla con los puntos de rendimiento en las diferentes combinaciones de sistemas operativos y navegadores. Las pruebas automatizadas con Selenium facilitan mucho este tipo de pruebas debido a que tiene una gran soporte con diferentes navegadores y sistemas operativos.

✅  El objetivo de las pruebas end-to-end es verificar que todos los puntos de contacto con la aplicación web funcionen. Por ejemplo, el tester podría escribir una serie de casos de prueba para verificar que la búsqueda, el registro, el pago y la consulta de un producto, funcionen según lo previsto (y fallen cuando se ingresen valores no válidos en los campos correspondientes).

¿Por qué automatizar pruebas con Selenium?

Cuando se realizan pruebas con frecuencia y de manera repetitiva, es un buen momento para comenzar a evaluar la necesidad de realizar pruebas automatizadas. También, cuando comienza a consumir mucho tiempo realizarlas de forma manual. Es allí cuando se debería de evaluar su automatización con Selenium.

Como se ha mencionado anteriormente, son muchas las ventajas para utilizar Selenium a la hora de implementar pruebas automatizadas: no requiere una licencia ni costos para utilizarlo, imita acciones de usuario, fácil de implementar, cuenta con diferentes herramientas según cada escenario, soporta diferentes lenguajes de programación, es compatible con otros framework, el código puede ser reutilizable y posee el soporte de una comunidad bastante grande.

¿Cómo elegir la herramienta correcta de Selenium para trabajar?

Debido a que hay varias herramientas o componentes de Selenium, puede que la decisión sobre qué herramienta utilizar no sea tarea sencilla para nuevos usuarios. A continuación se detalla una breve guia para poder elegir correctamente los componentes de Selenium a utilizar para cada necesidad:

Selenium IDE

  • Si se tiene poco conocimiento previo de programación y de pruebas automatizadas.
  • Para crear casos de pruebas simples y suites de pruebas, que luego se pueden exportar a Selenium WebDriver.
  • Ejecutar código JavaScript personalizado utilizando runScript.
  • Se puede probar una aplicación web solo en Firefox y Chrome.
  • Se puede exportar el script de pruebas en varios lenguajes de programación.

Selenium WebDriver

  • Si se necesita utilizar un lenguaje de programación específico para sus casos de prueba automatizados.
  • Para probar aplicaciones y generar reportes personalizados con formato HTML.
  • Si se desea probar aplicaciones web con datos dinámicos.
  • Para probar aplicaciones con funcionalidades basadas en AJAX.
  • Si se desea probar aplicaciones en diferentes plataformas usando Selenium Grid o probar aplicaciones en CI/CD.

Selenium Grid

  • Si se necesita ejecutar casos de prueba automatizados en diferentes navegadores y sistemas operativos simultáneamente.
  • Si se necesita ejecutar un suite de pruebas muy grande y en el menor tiempo posible.

Ejemplo de caso de prueba para automatizar con Selenium

Supongamos que se requiere probar de forma manual un escenario en el que se deberá verificar en una pantalla el registro de usuarios de una aplicación web. Se deberán validar los campos de entrada y registro de un usuario correctamente.

1. Ingresar la URL en la barra de direcciones.

2. Ingresar datos inválidos en cada campo de entrada (correo electrónico, nombre de usuario y contraseña).

3. Comprobar si las cadenas de entrada se validaron con las expresiones regulares correspondientes y cualquier valor preexistente en la base de datos.

4. Ingresar datos válidos en cada campo de entrada; hacer clic en Registrarse.

5. Comprobar si se mostró la página de Bienvenida con el nombre de usuario.

6. Marcar la prueba como «aprobada» si lo hizo, «fallida» si la función de registro se interrumpió en algún momento durante la prueba.

Es una prueba de sistema muy común y es muy probable que los testers verifiquen todos los flujos posibles en busca de errores, en todas las combinaciones de sistema operativo y en tantos navegadores como sea necesario.

Dependiendo de la cantidad de testers manuales y el detalle de los casos de prueba, la tarea puede llevar días o semanas para asegurarse que la aplicación sea funcional.

Por lo que cuando nos enfrentamos a este tipo de casos de prueba y además se realizan repetitivamente, es el momento para comenzar a realizar las pruebas automatizadas con Selenium.

En resumen

Selenium es una herramienta de automatización para aplicaciones web muy completa, donde observamos que sus múltiples funcionalidades cubren gran parte de las necesidades importantes de los usuarios que desean automatizar.

Para cumplir con dichas necesidades es que Selenium cuenta con un conjunto de herramientas como Selenium IDE, Selenium WebDriver y Selenium Grid; y cada una de ellas cuenta con sus propias particularidades que se pueden utilizar individualmente o entre sí. 

Además, una de las principales características por el cual Selenium se destaca es por su amplia cobertura y soporte para diferentes lenguajes de programación, sistemas operativos y navegadores.

El uso de Selenium facilita la realización y ejecución de  pruebas funcionales, lo que hace que mejore la calidad de las aplicaciones web.