# Selenium

Selenium es un entorno de pruebas de software para aplicaciones basadas en la web. Selenium provee una herramienta de grabar/reproducir para crear pruebas sin usar un lenguaje de scripting para pruebas (Selenium IDE). Incluye también un lenguaje específico de dominio para pruebas (Selenese) para escribir pruebas en un amplio número de lenguajes de programación populares incluyendo Java, C#, Ruby, Groovy, Perl, PHP y Python. Las pruebas pueden ejecutarse entonces usando la mayoría de los navegadores web modernos en diferentes sistemas operativos como Windows, Linux y OSX.

## Historia

Selenium fue originalmente desarrollado por Jason Huggins en 2004 y pronto se unieron al esfuerzo otras personas especialistas en pruebas y programación. Es un software de código abierto bajo la licencia apache 2.0 que puede ser descargada y usada sin cargo. El nombre proviene de una broma hecha por Huggins burlándose de un competidor llamado Mercury (mercurio) diciendo que el envenenamiento por mercurio puede ser curado tomando complementos de Selenio. Los participantes tomaron el nombre y siguieron con él. Existen otros proyectos que se desarrollan alrededor de Selenium como Selenium Grid, para probar concurrencia de múltiples pruebas concurrentes de clientes remotos o locales, así como Flash Selenium para probar programas escritos en Adobe Flex o Selenium Silverlight.

## Componentes de Selenium
### Selenium IDE

Selenium IDE es un entorno de desarrollo integrado para pruebas con Selenium. Está implementado como una extensión de Firefox y Chrome y permite grabar, editar y depurar pruebas. Originalmente se le conoció como Selenium Recorder.
Se pueden desarrollar automáticamente scripts al crear una grabación y de esa manera se puede editar manualmente con sentencias y comandos para que la reproducción de nuestra grabación sea correcta
Los scripts se generan en Selanese, un lenguaje de scripting especial para Selenium. Selanese provee comandos que ejecutan acciones sobre objetos en el navegador, como hacer clic en un enlace, seleccionar de una lista de opciones, verificar la presencia de un texto en particular así como para tomar la totalidad de la página producto de las acciones.
Características:
* Grabación y reproducción fácil
* Selección inteligente de campos usando ID, nombre o XPath según se necesite.
* Compleción automática de los comandos de Selenium más comunes.
* Pruebas de revisión cruzada
* Depuración y puntos de verificación (breakpoint)
* Almacenar las pruebas como Selanese, Ruby, Java y otros formatos.
* Soporte al archivo user-extensions.js
* Opción para asertar el título de la página.
* Opción de modificarle a la medida con el uso de complementos

### Selenium Client API

Interfaz de programación de aplicaciones (API) de clientes Como alternativa a escribir pruebas en Selanese, las pruebas pueden escribirse en varios lenguajes de programación, éstos se comunican con Selenium mediante llamadas a los métodos de Selenium Client API. Actualmente Selenium provee API para Java, C#, Ruby y Python. Con Selenium 2 se presentó una nueva API de clientes, con WebDriver como componente central, aunque la anterior API puede seguirse usando llamando a la clase Selenium.

### Selenium Remote Control

Selenium Remote Control (RC) es un servidor escrito en Java que acepta comandos al navegador vía HTTP. RC hace posible escribir pruebas automatizadas para aplicaciones web, en cualquier lenguaje de programación lo que permite una mejor integración de Selenium a entornos de prueba existentes. Para hacer la escritura de pruebas más fácil, Selenium actualmente provee controladores de dispositivos para PHP, Python, Ruby,.NET, Perl y Java. El controlador de Java puede usarse para Javascript vía el motor Rhino. Selenium Remote Control fue una refactorización de Driven Selenium o Selenium B, la versión original lanzaba directamente un proceso para el navegador en cuestión desde el lenguaje de prueba; el protocolo de cable (confusamente llamado Selanese también en aquel tiempo) fue reimplementado al portarse a cada lenguaje. Después de la refactorización, hubo un proceso intermediario demonio entre el script controlador y el navegador. Los beneficios incluyeron la capacidad de controlar navegadores remotos y reducir la necesidad de portar el código a un número creciente de lenguajes. Con la liberación de Selenium 2, Selenium RC fue oficialmente descartado en favor de Selenium WebDriver.

### Selenium WebDriver

Selenium WebDriver es el sucesor de Selenium RC. Selenium WebDriver acepta comandos (enviados en Selenese o vía el API de cliente) y los envía a un navegador. Esto se implementa a través de un controlador del navegador específico para cada navegador que envía los comandos y trae los resultados de regreso. La mayoría de los controladores del navegador lanzan y acceden a la aplicación de navegador (como Mozilla Firefox o Internet Explorer), pero también hay un controlador para HtmlUnit que simula un navegador. A diferencia de Selenium 1, donde el servidor Selenium RC era indispensable, en Selenium WebDriver no se requiere de un servidor especial para ejecutar las pruebas, en vez de ello WebDriver inicia una instancia del navegador y lo controla; sin embargo puede usarse Selenium Grid (ver abajo) para ejecutar pruebas en sistemas remotos (ver más abajo). Desde inicios de 2012, Simon Stewart de Google (inventor del WebDriver) y David Burns de la Fundación Mozilla se encuentran negociando con el W3C que WebDriver se convierta en un estándar de Internet, como tal Selenium-Webdriver (Selenium 2.0) apunta a ser la implementación de referencia del estándar WebDriver en varios lenguajes de programación. Selenium-WebDriver está completamente implementado y soportado en Java, Ruby, Python y C#. En la práctica, esto significa que la API de Selenium 2.0 tiene significativamente menos llamadas que el API de Selenium 1.0. Donde Selenium 1.0 intentaba proveer una interfaz rica en muchas operaciones, Selenium 2.0 intenta proveer de los bloques de construcción básicos con los cuales los desarrolladores puedan programar su propio lenguaje específico de dominio. Uno de ellos ya existe y es el proyecto Watir en Ruby que tiene una historia rica en buen diseño. Watir-WebDriver implementa el API de Watir como un envolvente del Selenium-Webdriver en Ruby. Watir-WebDriver se crea de forma completamente automática, basado en las especificaciones del WebDriver y HTML.

### Selenium Grid

Selenium Grid es un servidor que permite usar instancias de navegador ejecutándose en máquinas remotas. Con Selenium Grid, uno de los servidores actúa como concentrador. Las pruebas contactan al concentrador para obtener acceso a instancias de navegadores; el concentrador lleva una lista de instancias de los navegadores (Nodos de WebDriver) y permiten a las pruebas usar estas instancias. Selenium Grid permite ejecutar pruebas en paralelo en múltiples máquinas y manejar diferentes versiones y configuraciones de manera centralizada. ....