Diferencia entre revisiones de «Selenium»
(→Integracion con JUnit 4.x) |
|||
(No se muestran 27 ediciones intermedias de 7 usuarios) | |||
Línea 1: | Línea 1: | ||
− | [[Selenium]] es una herramienta de | + | [[Selenium]] es una herramienta de [[Software Libre]] para pruebas de aplicaciones Web. Las pruebas de [[Selenium]] se ejecutan directamente en un navegador y facilitan las pruebas de compatibilidad en navegadores, también como pruebas funcionales de aceptación de aplicaciones Web. |
La herramienta [[Selenium]] posee un ambiente de desarrollo llamado [[Selenium]] IDE, este facilita el registro de pruebas de aceptación y su depuración. | La herramienta [[Selenium]] posee un ambiente de desarrollo llamado [[Selenium]] IDE, este facilita el registro de pruebas de aceptación y su depuración. | ||
Línea 7: | Línea 7: | ||
Para poder armar el test es necesario incluir los siguientes jars. | Para poder armar el test es necesario incluir los siguientes jars. | ||
+ | *selenium-java-client-driver-tests.jar | ||
*selenium-java-client-driver.jar | *selenium-java-client-driver.jar | ||
− | *selenium- | + | *selenium-server-tests.jar |
− | |||
*selenium-server.jar | *selenium-server.jar | ||
− | |||
− | |||
− | < | + | Se pueden descargar de acá: [http://archiva.openqa.org/repository/releases/org/openqa/selenium/selenium-remote-control/1.0-beta-1/selenium-remote-control-1.0-beta-1-dist.zip Librerías] |
+ | |||
+ | |||
+ | <code java> | ||
import org.junit.Before; | import org.junit.Before; | ||
import org.junit.Test; | import org.junit.Test; | ||
Línea 30: | Línea 31: | ||
@Before | @Before | ||
public void setUp(String browser) throws Exception { | public void setUp(String browser) throws Exception { | ||
− | / | + | // Se instancia el server de selenium por default toma el puerto 4444 |
seleniumServer = new SeleniumServer(); | seleniumServer = new SeleniumServer(); | ||
seleniumServer.start(); | seleniumServer.start(); | ||
− | / | + | |
− | / | + | // Se configura el acceso a la pagina por medio del server de selenium |
− | + | // DefaultSelenium("SELENIUM_HOST", PUERTO, "BROWSER", URL_DE_LA_APLICACION); | |
− | + | // En este ejemplo, se utiliza Internet Explorer: "*iehta" | |
− | |||
selenium = new DefaultSelenium("localhost", 4444, "*iehta", "http://www.google.com"); | selenium = new DefaultSelenium("localhost", 4444, "*iehta", "http://www.google.com"); | ||
selenium.start(); | selenium.start(); | ||
} | } | ||
+ | /** Al finalizar los tests, detener el server de Selenium | ||
+ | */ | ||
+ | @Override | ||
+ | public void tearDown() throws Exception { | ||
+ | // Se para la conexión con la pagina | ||
+ | selenium.stop(); | ||
+ | |||
+ | // Se para la instancia del server de selenium | ||
+ | seleniumServer.stop(); | ||
+ | } | ||
+ | |||
+ | |||
+ | /** Testeamos una búsqueda en Google | ||
+ | * Accedemos a Google, realizamos una búsqueda y comprobamos que venga el resultado esperado | ||
+ | */ | ||
@Test | @Test | ||
public void testGoogle() throws Exception { | public void testGoogle() throws Exception { | ||
Línea 53: | Línea 68: | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | </ | + | </code> |
+ | |||
+ | ==Sobre waitForPageToLoad== | ||
+ | |||
+ | Es importante que la página esté cargada antes de hacer las verificaciones sobre el nuevo contenido. Para hacer más sólido el caso de prueba ubica un waitForPageToLoad luego de un click. | ||
+ | |||
+ | Es recomendable que al terminar un caso de prueba ubiques un waitForPageToLoad y así te aseguras que el próximo caso de prueba no falle al comenzar. | ||
+ | ghjgjgj | ||
+ | |||
+ | Yo, good lkooin out! Gonna make it work now. | ||
+ | |||
+ | ==Sobre assertTextPresent== | ||
+ | |||
+ | Este comando es útil después de cada comando clickAndWait para confirmar un texto debe estar presente en la página. | ||
+ | |||
+ | |||
+ | ==Sobre verifyTrue== | ||
+ | |||
+ | Al realizar [http://www.dosideas.com/java/743-test-secuencial-con-selenium-y-junit.html test secuencial] con [[Selenium]] IDE, y verificar texto en la página, después de convertir el test a código Java -para correrlo con JUnit- queda generado con el comando | ||
+ | |||
+ | <code html4strict> | ||
+ | |||
+ | verifyTrue(selenium.isTextPresent("Algun texto")); | ||
+ | |||
+ | </code> | ||
+ | |||
+ | Este comando no genera fallas en el test en caso que el texto buscado no se encuentre en la página. El comando adecuado para que se genere la falla es | ||
+ | |||
+ | <code html4strict> | ||
+ | |||
+ | assertTrue(selenium.isTextPresent("Algun texto")); | ||
+ | |||
+ | </code> | ||
+ | |||
+ | == Sobre Popups == | ||
+ | |||
+ | En Selenium, se trabaja con una ventana a la vez. Para trabajar con diferentes ventanas (por ejemplo, un popup) se necesita primero elegir la ventana en cuestión. Y no solo basta con esto, tambien dicha ventana tiene que ser identificada. La forma mas facil de realizar esto es capturar el id de la nueva ventana con Selenium IDE. | ||
+ | |||
+ | Si la ventana se abre con un target="_blank" no se podrá utilizar Selenium para acceder a dicha ventana dado a que el id que se genera es random. Hay un [http://jira.openqa.org/browse/SEL-203 Jira] abierto en Selenium para resolver esto. | ||
+ | |||
+ | == Sobre caracteres especiales == | ||
+ | |||
+ | Para que hudson tome bien los acentos (y caracteres especiales) en los test de selenium hay que usar unicode. | ||
+ | |||
+ | Los codigos son: | ||
+ | |||
+ | *á -> \u00e1 | ||
+ | *é -> \u00e9 | ||
+ | *í -> \u00ed | ||
+ | *ó -> \u00f3 | ||
+ | *ú -> \u00fa | ||
+ | *Á -> \u00c1 | ||
+ | *É -> \u00c9 | ||
+ | *Í -> \u00cd | ||
+ | *Ó -> \u00d3 | ||
+ | *Ú -> \u00da | ||
+ | *ñ -> \u00f1 | ||
+ | *Ñ -> \u00d1 | ||
+ | |||
+ | *ü -> \u00FC | ||
+ | *Ü -> \u00DC | ||
+ | *ç -> \u00E7 | ||
+ | *Ç -> \u00C7 | ||
+ | *¿ -> \u00BF | ||
+ | *¡ -> \u00A1 | ||
+ | |||
+ | == Sobre la integración contínua == | ||
+ | |||
+ | Cuando se usa Selenium en un proceso de integración contínua puede pasar que nos encontremos con tests que fallan porque no se encuentran los elementos esperados. Lo bueno es saber qué se encontró en lugar de lo que se esperaba. | ||
+ | |||
+ | El método selenium.getBody() retorna un String con el texto de la página en la que se encuentra selenium en ese momento, pero lo mejor de todo es que además lo escribe en consola. | ||
+ | |||
+ | Si miramos la salida por consola del test fallido vamos a encontrar la secuencia de los comandos de selenium y en los lugares donde hayamos puesto los getBody() vamos a ver intercalado los textos que mostraba la página en ese momento. | ||
+ | |||
+ | == Selenium 2.0 and WebDriver == | ||
+ | Tiene muchas características nuevas y mejoras con respecto selenium 1. | ||
+ | |||
+ | La nueva característica principal es la integración de la API WebDriver. | ||
+ | Esto surge a partir de una serie de limitaciones, junto con ofrecer una alternativa, y más simple, interfaz de programación. El objetivo es desarrollar una API orientada a objetos que proporciona apoyo adicional para un mayor número de navegadores con soporte mejorado para los modernos problemas avanzados de pruebas de aplicaciones web. | ||
+ | |||
+ | === Migrar de Selenium RC a Selenium WebDriver === | ||
+ | |||
+ | Ventajas: | ||
+ | * El API WebDriver es más orientada a objetos que el original de la API de selenium RC. Esto puede hacer que sea más fácil trabajar con él. | ||
+ | |||
+ | * Mejora de la emulación de las interacciones del usuario. Siempre que sea posible, WebDriver hace uso de eventos nativos con el fin de interactuar con una página web. | ||
+ | |||
+ | * El apoyo de los fabricantes de navegadores. Opera, Mozilla y Google son todos los participantes activos en el desarrollo de WebDriver, y cada uno tiene ingenieros trabajando para mejorar el marco. | ||
+ | |||
+ | El primer paso para empezar a migrar es cambiar como obtener la instancia de selenium. Cuando se utiliza Selenium RC, seria: | ||
+ | |||
+ | <code java> | ||
+ | Selenium selenium = new DefaultSelenium( | ||
+ | "localhost", 4444, "*firefox", "http://www.dosideas.com"); | ||
+ | selenium.start(); | ||
+ | </code> | ||
+ | |||
+ | Estas lineas hay que cambiarlas por: | ||
+ | |||
+ | <code java> | ||
+ | WebDriver driver = new FirefoxDriver(); | ||
+ | Selenium selenium = new WebDriverBackedSelenium(driver, "http://www.dosideas.com"); | ||
+ | </code> | ||
+ | |||
+ | === Como inicializar el driver de Firefox con un perfil particular === | ||
+ | |||
+ | Cuando se quiere utilizar Firefox para correr los test, es posible que necesitemos que el perfil tenga algunas caracteristicas que no vienen por default. | ||
+ | Esto se realiza de la siguiente manera: | ||
+ | |||
+ | Creamos un nuevo perfil: | ||
+ | |||
+ | <code java>FirefoxProfile profile = new FirefoxProfile(); | ||
+ | </code> | ||
+ | |||
+ | Si por ejemplo, nosotros queremos agregarle a la configuracion del perfil para que utilice un proxy deberias poner: | ||
+ | |||
+ | <code java> | ||
+ | profile.setPreference("network.proxy.type", 1); | ||
+ | profile.setPreference("network.proxy.http", "proxy.dosideas.com"); | ||
+ | profile.setPreference("network.proxy.http_port", 8080); | ||
+ | profile.setPreference("network.proxy.no_proxies_on", "PC-DOSIDEAS"); | ||
+ | </code> | ||
+ | |||
+ | Nota: El atributo network.proxy.no_proxies_on indica que el proxy no se utiliza para esa direccion. | ||
+ | |||
+ | Finalmente, agregamos el nuevo perfil al driver e inicializamos normalmente: | ||
+ | |||
+ | <code java> | ||
+ | WebDriver driver = new FirefoxDriver(profile); | ||
+ | </code> | ||
+ | |||
+ | |||
==Ver también== | ==Ver también== | ||
*[[Herramientas Para Pruebas De Aceptacion]] | *[[Herramientas Para Pruebas De Aceptacion]] | ||
*[http://selenium.openqa.org/ Web oficial de Selenium] | *[http://selenium.openqa.org/ Web oficial de Selenium] | ||
+ | *[http://www.pghcodingdojo.org/index.php/Selenium_RC_Tutorial Selenium RC Tutorial] | ||
+ | *[http://www.dosideas.com/java/743-test-secuencial-con-selenium-y-junit.html Test Secuencial con Selenium y JUnit] | ||
+ | *[http://seleniumhq.org/docs/04_selenese_commands.html#verifying-page-elements Comandos de Verificación de elementos en páginas web] | ||
+ | *[http://wiki.openqa.org/display/SEL/Selenium+Core+FAQ#SeleniumCoreFAQ-HowdoIworkwithapopupwindow%3F Popup con Selenium] | ||
+ | *[[Simplium]] | ||
+ | |||
+ | [[Category:ATDD]] |
Revisión actual del 14:14 12 oct 2011
Selenium es una herramienta de Software Libre para pruebas de aplicaciones Web. Las pruebas de Selenium se ejecutan directamente en un navegador y facilitan las pruebas de compatibilidad en navegadores, también como pruebas funcionales de aceptación de aplicaciones Web.
La herramienta Selenium posee un ambiente de desarrollo llamado Selenium IDE, este facilita el registro de pruebas de aceptación y su depuración.
Contenido
Integracion con JUnit 4.x
Para poder armar el test es necesario incluir los siguientes jars.
- selenium-java-client-driver-tests.jar
- selenium-java-client-driver.jar
- selenium-server-tests.jar
- selenium-server.jar
Se pueden descargar de acá: Librerías
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.server.SeleniumServer;
import com.thoughtworks.selenium.DefaultSelenium; import com.thoughtworks.selenium.SeleneseTestCase;
public class GoogleWebTest extends SeleneseTestCase {
private DefaultSelenium selenium; private SeleniumServer seleniumServer;
@Override @Before public void setUp(String browser) throws Exception { // Se instancia el server de selenium por default toma el puerto 4444 seleniumServer = new SeleniumServer(); seleniumServer.start();
// Se configura el acceso a la pagina por medio del server de selenium // DefaultSelenium("SELENIUM_HOST", PUERTO, "BROWSER", URL_DE_LA_APLICACION); // En este ejemplo, se utiliza Internet Explorer: "*iehta" selenium = new DefaultSelenium("localhost", 4444, "*iehta", "http://www.google.com"); selenium.start(); }
/** Al finalizar los tests, detener el server de Selenium */ @Override public void tearDown() throws Exception { // Se para la conexión con la pagina selenium.stop();
// Se para la instancia del server de selenium seleniumServer.stop(); }
/** Testeamos una búsqueda en Google * Accedemos a Google, realizamos una búsqueda y comprobamos que venga el resultado esperado */ @Test public void testGoogle() throws Exception { selenium.open("http://www.google.com/webhp"); assertEquals("Google", selenium.getTitle()); selenium.type("q", "Selenium OpenQA"); assertEquals("Selenium OpenQA", selenium.getValue("q")); selenium.click("btnG"); selenium.waitForPageToLoad("30000"); assertEquals("Selenium OpenQA - Google Search", selenium.getTitle()); }
}
Sobre waitForPageToLoad
Es importante que la página esté cargada antes de hacer las verificaciones sobre el nuevo contenido. Para hacer más sólido el caso de prueba ubica un waitForPageToLoad luego de un click.
Es recomendable que al terminar un caso de prueba ubiques un waitForPageToLoad y así te aseguras que el próximo caso de prueba no falle al comenzar. ghjgjgj
Yo, good lkooin out! Gonna make it work now.
Sobre assertTextPresent
Este comando es útil después de cada comando clickAndWait para confirmar un texto debe estar presente en la página.
Sobre verifyTrue
Al realizar test secuencial con Selenium IDE, y verificar texto en la página, después de convertir el test a código Java -para correrlo con JUnit- queda generado con el comando
verifyTrue(selenium.isTextPresent("Algun texto"));
Este comando no genera fallas en el test en caso que el texto buscado no se encuentre en la página. El comando adecuado para que se genere la falla es
assertTrue(selenium.isTextPresent("Algun texto"));
Sobre Popups
En Selenium, se trabaja con una ventana a la vez. Para trabajar con diferentes ventanas (por ejemplo, un popup) se necesita primero elegir la ventana en cuestión. Y no solo basta con esto, tambien dicha ventana tiene que ser identificada. La forma mas facil de realizar esto es capturar el id de la nueva ventana con Selenium IDE.
Si la ventana se abre con un target="_blank" no se podrá utilizar Selenium para acceder a dicha ventana dado a que el id que se genera es random. Hay un Jira abierto en Selenium para resolver esto.
Sobre caracteres especiales
Para que hudson tome bien los acentos (y caracteres especiales) en los test de selenium hay que usar unicode.
Los codigos son:
- á -> \u00e1
- é -> \u00e9
- í -> \u00ed
- ó -> \u00f3
- ú -> \u00fa
- Á -> \u00c1
- É -> \u00c9
- Í -> \u00cd
- Ó -> \u00d3
- Ú -> \u00da
- ñ -> \u00f1
- Ñ -> \u00d1
- ü -> \u00FC
- Ü -> \u00DC
- ç -> \u00E7
- Ç -> \u00C7
- ¿ -> \u00BF
- ¡ -> \u00A1
Sobre la integración contínua
Cuando se usa Selenium en un proceso de integración contínua puede pasar que nos encontremos con tests que fallan porque no se encuentran los elementos esperados. Lo bueno es saber qué se encontró en lugar de lo que se esperaba.
El método selenium.getBody() retorna un String con el texto de la página en la que se encuentra selenium en ese momento, pero lo mejor de todo es que además lo escribe en consola.
Si miramos la salida por consola del test fallido vamos a encontrar la secuencia de los comandos de selenium y en los lugares donde hayamos puesto los getBody() vamos a ver intercalado los textos que mostraba la página en ese momento.
Selenium 2.0 and WebDriver
Tiene muchas características nuevas y mejoras con respecto selenium 1.
La nueva característica principal es la integración de la API WebDriver. Esto surge a partir de una serie de limitaciones, junto con ofrecer una alternativa, y más simple, interfaz de programación. El objetivo es desarrollar una API orientada a objetos que proporciona apoyo adicional para un mayor número de navegadores con soporte mejorado para los modernos problemas avanzados de pruebas de aplicaciones web.
Migrar de Selenium RC a Selenium WebDriver
Ventajas:
- El API WebDriver es más orientada a objetos que el original de la API de selenium RC. Esto puede hacer que sea más fácil trabajar con él.
- Mejora de la emulación de las interacciones del usuario. Siempre que sea posible, WebDriver hace uso de eventos nativos con el fin de interactuar con una página web.
- El apoyo de los fabricantes de navegadores. Opera, Mozilla y Google son todos los participantes activos en el desarrollo de WebDriver, y cada uno tiene ingenieros trabajando para mejorar el marco.
El primer paso para empezar a migrar es cambiar como obtener la instancia de selenium. Cuando se utiliza Selenium RC, seria:
Selenium selenium = new DefaultSelenium(
"localhost", 4444, "*firefox", "http://www.dosideas.com");
selenium.start();
Estas lineas hay que cambiarlas por:
WebDriver driver = new FirefoxDriver();
Selenium selenium = new WebDriverBackedSelenium(driver, "http://www.dosideas.com");
Como inicializar el driver de Firefox con un perfil particular
Cuando se quiere utilizar Firefox para correr los test, es posible que necesitemos que el perfil tenga algunas caracteristicas que no vienen por default. Esto se realiza de la siguiente manera:
Creamos un nuevo perfil:
FirefoxProfile profile = new FirefoxProfile();
Si por ejemplo, nosotros queremos agregarle a la configuracion del perfil para que utilice un proxy deberias poner:
profile.setPreference("network.proxy.type", 1);
profile.setPreference("network.proxy.http", "proxy.dosideas.com");
profile.setPreference("network.proxy.http_port", 8080);
profile.setPreference("network.proxy.no_proxies_on", "PC-DOSIDEAS");
Nota: El atributo network.proxy.no_proxies_on indica que el proxy no se utiliza para esa direccion.
Finalmente, agregamos el nuevo perfil al driver e inicializamos normalmente:
WebDriver driver = new FirefoxDriver(profile);