En la actualidad existen innumerables aplicaciones web que se encuentran desarrolladas para ejecutarse en un navegador tradicional. En un era donde las aplicaciones son altamente interactivas, la automatización de los tests realizados suele ser un requerimiento, sobre todo cuando la metodologías desarrollo de software utilizadas son metodologías ágiles.

Existen muchas ventajas en desarrollar tests automatizados, sobre todo relacionado a acciones que son altamente repetitivas, cuyo control requiere una gran exactitud y/o toma mucho tiempo realizarlas.

Hay muchas alternativas disponibles para el desarrollo de la automatización de dichos tests pero una muy bien conocida y utilizada es Selenium.

¿Qué es Selenium?

Selenium es un conjunto de herramientas que nos permiten el desarrollo de tests automatizados. Dentro de estas herramientas se encuentra Selenium IDE el cual nos permite grabar un conjunto de acciones, que luego pueden ser repetidas sin la necesidad de la presencia del usuario. Esta herramienta es de gran ayuda pero tiene grandes limitaciones cuando los tests se vuelven más complicados.

Otra gran herramienta, sobre la cual nos centraremos en este artículo es el WebDriver. Selenium a partir de la versión 2.0 se utiliza un “WebDriver” quien es el encargado de comunicar o traducir las acciones enviadas a un navegador y recibir su respuesta. Así, es posible realizar tests automatizados creando flujos de acciones simulando a un usuario real.

Esta herramienta, unida a otras como TestNG y librerías de reportes de errores conforman un portfolio de herramientas extremadamente útiles a la hora del desarrollo de tests automáticos.

No obstante, no todo se vuelve tan sencillo cuando la cantidad y complejidad de estos tests aumenta, y muchas veces con solo las funcionalidades de Selenium no es posible ser eficiente en el desarrollo de los tests.

Por lo último mencionado queremos dar a conocer una librería basada en Selenium que nos ha sido de gran ayuda para salvar los “inconvenientes” ocurridos en la utilización de Selenium. Esta librería es Selenide.

 

¿Qué es Selenide?

Selenide es una librería basada en Selenium cuyo objetivo es simplificar el desarrollo de tests ofreciendo métodos que permitan resolver de forma efectiva los problemas más comunes que se encuentran durante el desarrollo de un test automatizado, así como también ayudar en el proceso de debug teniendo en cuenta la performance.

En general, lo cual podría ser la mayor distinción, es que Selenium es una librería de bajo nivel (low-level library) para poder interactuar con el browser, Selenide es una librería de alto nivel (high-level library) para desarrollar tests automatizados.

 

Codificando en Selenide vs Codificando en Selenium.

Una de las mayores ventajas de Selenide es que es una librería hecha para testing, en cambio Selenium, se enfoca simplemente en el manejo del browser. Selenide ofrece varios métodos que nos permiten resolver los problemas más comunes que podrían encontrarse a la hora de desarrollar tests automatizados.

Además todos estos métodos añadidos tienen nombres muy intuitivos que nos permite, junto a la funcionalidad de autocompletado de los IDE de desarrollo, no necesitar de documentación extra para conocerlos y/o utilizarlos.

 

¿Cuáles son las bondades de Selenide por sobre Selenium que lo hace tentador a la hora de desarrollar nuevos test automatizados o refactorizar tests ya realizados?

Existen varias funcionalidades que Selenide agrega por sobre las funcionalidades ya existentes en Selenium y que nos son de gran ayuda.

A continuación se listan cada una de las funcionalidades más importantes junto a un ejemplo de aplicación concreta.

 

  • Smart Waitings – Ahorrar tiempo

Una de las dificultades encontradas a la hora de programar tests utilizando Selenium es que sus metodos de busqueda de elementos en la UI (webdriver.findElement(locator) para un elemento, y webdriver.findElements(locator) para una lista de elementos) no verificarán que el elemento esté disponible en la UI.

Selenide reimplementa dichos métodos ($(locator) para un elemento y $$(locator) para una lista de elementos) agregándoles un tiempo de espera dinámico, con un timeout totalmente configurable. Estos métodos intentan interactuar con el elemento solicitado solamente si este se encuentra visible en la UI. El timeout configurado por defecto es de 4 segundos pero podemos cambiarlo globalmente con esta línea (el tiempo está en milisegundos):

Captura1


Además en caso de que quisiéramos por ejemplo para un elemento específico esperar más tiempo que el tiempo configurado en dicho timeout o esperar por una condición en concreto selenide nos ofrece métodos como

Captura2

donde el primer parámetro representa la condition esperada y el segundo el tiempo esperado en milisegundos. Luego mencionaremos más bondades de esta clase “Condition”.

 

  • Find elements by text and parent/children

Existen ocasiones donde por la forma que se encuentra realizada la aplicación, el framework utilizado, etc, localizar un elemento específico nos puede ocasionar problemas. Para ello Selenide nos ofrece la posibilidad de buscar elementos por texto imitando el comportamiento de un usuario real a la hora de buscar un elemento y también la posibilidad de a partir de un elemento particular navegar hasta su padre. En selenium solo es posible navegar hacia abajo en la jerarquía, es decir hacia los hijos solamente.

Estas funciones combinadas pueden salvarnos de dolores de cabeza en situaciones particulares como por ejemplo al tener que trabajar con tablas.

Captura3

  • Mensajes de error y excepciones

Cuando nos encontramos realizando un debugging de nuestros tests porque no están funcionando de la manera deseada, sea la razón que fuere, es muy común en Selenium no obtener mensajes o excepciones lo suficientemente descriptivas para dirigirnos al posible error, e incluso algunas veces el error mostrado es producto de otro error oculto, que nos hace malinterpretar el problema.

Selenide para ello redefine las excepciones de Selenium lanzando otras con descripciones visiblemente más claras como así también un resúmen del error ocurrido en las primeras líneas antes de mostrar el stack completo de llamadas. Esto nos permite dirigirnos al problema de una forma más directa reduciendo el tiempo de debug.

 

  • Automated screenshots

Hay situaciones donde existen escenarios complejos en los cuales saber si lo que se nos está mostrando como error se debe a un bug de la aplicación o a un problema con el flujo del test, para estos casos como así también cualquier caso en general, Selenide nos ofrece la posibilidad de realizar una captura de pantalla por cada test qué ha fallado sin configuración alguna. Además agregando en el output de la consola un link de donde se encuentra dicha screenshot.

La ruta donde estas se guardan es configurable a través de un parámetro global de la clase configuration llamado  Configuration.reportsFolder.

Captura4

  • Clases útiles: Condition y Configuration

Existen dos clases que nos ofrecen una gran ayuda, ellas son la clase Configuration y la clase Condition.

La clase Configuration contiene todos las configuraciones globales que podemos necesitar modificar para una suite de tests, como por ejemplo el tipo de navegador, el timeout por default para la espera de elementos, la carpeta donde se guardarán las screenshots. intervalPolling (tiempo esperado entre cada consulta para averiguar si un elemento se encuentra disponible), etc. En la documentación se puede ver cada uno de estos parámetros.

La clase Condition contiene un conjunto de condiciones que son útiles a la hora de utilizar filtros y esperas específicas por elementos. Las condiciones más comunes son exist, appear, disappear, enable, disable, etc.

Pero además, y su mayor bondad, nosotros podemos extender de dicha clase y realizar nuestra propia condition personalizada respecto a condiciones particulares de estilos de css en nuestra aplicación, validaciones que tengan que ver con el negocio, etc.

 

En una próxima entrega se mencionarán más funcionalidades de Selenide, entre ellas un reporte de performance, la utilización e implementación de un método para filtrar elementos de una colección de elementos, el manejo del WebDriver, entre otros.

Este es el sitio oficial http://selenide.org/, donde se puede encontrar la documentación como así también un foro y toda la información  necesaria.

Website Pin Facebook Twitter Myspace Friendfeed Technorati del.icio.us Digg Google StumbleUpon Premium Responsive