Usando la clase Java "myclass" que creamos en el tutorial anterior, intentemos crear un script de WebDriver que:
- buscar la página de inicio de Mercury Tours
- verificar su título
- imprimir el resultado de la comparación
- ciérrelo antes de finalizar todo el programa.
Código WebDriver
A continuación se muestra el código WebDriver real para la lógica presentada por el escenario anterior
Nota: Al iniciar Firefox 35, debe usar el controlador gecko creado por Mozilla para usar el controlador web. Selenium 3.0, gecko y firefox tienen problemas de compatibilidad y configurarlos correctamente podría convertirse en una tarea cuesta arriba. Si el código no funciona, cambie a Firefox versión 47 o inferior. Alternativamente, puede ejecutar sus scripts en Chrome. El selenio funciona desde el primer momento para Chrome. Solo necesita cambiar 3 líneas de código para que su script funcione con Chrome o Firefox
paquete newproject;importar org.openqa.selenium.WebDriver;importar org.openqa.selenium.firefox.FirefoxDriver;// comenta la línea de arriba y quita el comentario de la línea de abajo para usar Chrome// importar org.openqa.selenium.chrome.ChromeDriver;clase pública PG1 {public static void main (String [] args) {// declaración e instanciación de objetos / variablesSystem.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Controlador WebDriver = nuevo FirefoxDriver ();// comente las 2 líneas anteriores y descomente las 2 líneas siguientes para usar Chrome//System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe ");// Controlador WebDriver = new ChromeDriver ();String baseUrl = "http://demo.guru99.com/test/newtours/";StringpectedTitle = "Bienvenido: Mercury Tours";String actualTitle = "";// lanza Fire fox y lo dirige a la URL basedriver.get (baseUrl);// obtiene el valor real del títuloactualTitle = driver.getTitle ();/ ** comparar el título real de la página con el esperado e imprimir* el resultado como "Aprobado" o "Fallido"* /if (actualTitle.contentEquals (esperabaTitulo)) {System.out.println ("¡Prueba aprobada!");} demás {System.out.println ("Prueba fallida");}// cerrar zorro de fuegodriver.close ();}}
Explicando el código
Importación de paquetes
Para comenzar, debe importar los siguientes dos paquetes:
- org.openqa.selenium. * : contiene la clase WebDriver necesaria para crear una instancia de un nuevo navegador cargado con un controlador específico
- org.openqa.selenium.firefox.FirefoxDriver : contiene la clase FirefoxDriver necesaria para crear una instancia de un controlador específico de Firefox en el navegador instanciado por la clase WebDriver
Si su prueba necesita acciones más complicadas, como acceder a otra clase, tomar capturas de pantalla del navegador o manipular archivos externos, definitivamente necesitará importar más paquetes.
Creación de instancias de objetos y variables
Normalmente, así es como se crea una instancia de un objeto de controlador.
Una clase FirefoxDriver sin parámetros significa que nuestro programa Java iniciará el perfil predeterminado de Firefox. El perfil predeterminado de Firefox es similar a iniciar Firefox en modo seguro (no se cargan extensiones).
Por conveniencia, guardamos la URL base y el título esperado como variables.
Iniciar una sesión de navegador
El método get () de WebDriver se utiliza para iniciar una nueva sesión de navegador y la dirige a la URL que especifique como parámetro.
Obtenga el título de la página real
La clase WebDriver tiene el método getTitle () que siempre se usa para obtener el título de la página cargada actualmente.
Compare los valores esperados y reales
Esta parte del código simplemente usa una estructura if-else básica de Java para comparar el título real con el esperado.
Finalización de una sesión de navegador
El método " close () " se utiliza para cerrar la ventana del navegador.
Terminación de todo el programa
Si usa este comando sin cerrar primero todas las ventanas del navegador, todo su programa Java terminará dejando la ventana del navegador abierta.
Ejecutando la prueba
Hay dos formas de ejecutar código en Eclipse IDE.
- En la barra de menú de Eclipse, haga clic en Ejecutar> Ejecutar.
- Presione Ctrl + F11 para ejecutar todo el código.
Si hiciste todo correctamente, Eclipse generaría "¡Prueba aprobada!"
Ubicación de los elementos de la GUI
La ubicación de elementos en WebDriver se realiza mediante el método " findElement (By. Locator ()) ". La parte del "localizador" del código es la misma que cualquiera de los localizadores discutidos anteriormente en los capítulos de Selenium IDE de estos tutoriales. De hecho, se recomienda que ubique los elementos de la GUI utilizando IDE y, una vez identificados correctamente, exporte el código a WebDriver.
Aquí hay un código de muestra de Selenium que ubica un elemento por su id. Facebook se utiliza como URL base.
paquete newproject;import org.openqa.selenium.By;importar org.openqa.selenium.WebDriver;importar org.openqa.selenium.firefox.FirefoxDriver;clase pública PG2 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Controlador WebDriver = nuevo FirefoxDriver ();String baseUrl = "http://www.facebook.com";String tagName = "";driver.get (baseUrl);tagName = driver.findElement (By.id ("correo electrónico")). getTagName ();System.out.println (tagName);driver.close ();System.exit (0);}}
Usamos el método getTagName () para extraer el nombre de la etiqueta de ese elemento en particular cuya identificación es "email". Cuando se ejecuta, este código debería poder identificar correctamente el nombre de etiqueta "entrada" y lo imprimirá en la ventana de la consola de Eclipse.
Resumen para localizar elementos
Variación | Descripción | Muestra |
---|---|---|
Por. nombre de la clase | encuentra elementos basados en el valor del atributo "clase" | findElement (By.className ("someClassName")) |
Por. cssSelector | encuentra elementos basados en el motor de selección CSS subyacente del controlador | findElement (By.cssSelector ("input # email")) |
Por. identificación | localiza elementos por el valor de su atributo "id" | findElement (By.id ("someId")) |
Por. Texto del enlace | encuentra un elemento de enlace por el texto exacto que muestra | findElement (By.linkText ("REGISTRO")) |
Por. nombre | localiza elementos por el valor del atributo "nombre" | findElement (By.name ("someName")) |
Por. parcialLinkText | localiza elementos que contienen el texto del enlace dado | findElement (By.partialLinkText ("REG")) |
Por. tagName | localiza elementos por su nombre de etiqueta | findElement (By.tagName ("div")) |
Por. xpath | localiza elementos a través de XPath | findElement (By.xpath ("// html / body / div / table / tbody / tr / td [2] / table / tbody / tr [4] / td / table / tbody / tr / td [2] / table / tbody / tr [2] / td [3] / form / table / tbody / tr [5] ")) |
Nota sobre el uso de findElement (By.cssSelector ())
By.cssSelector () no admite la función "contiene" . Considere el código IDE de Selenium a continuación:
En Selenium IDE anterior, pasó toda la prueba. Sin embargo, en el script de Selenium WebDriver a continuación, la misma prueba generó un error porque WebDriver no admite la palabra clave "contiene" cuando se usa en el método By.cssSelector ().
Comandos comunes
Creación de instancias de elementos web
En lugar de utilizar la sintaxis larga "driver.findElement (By.locator ())" cada vez que acceda a un elemento en particular, podemos crear una instancia de un objeto WebElement para él. La clase WebElement está contenida en el paquete "org.openqa.selenium. *".
Hacer clic en un elemento
Hacer clic es quizás la forma más común de interactuar con elementos web . El método click () se utiliza para simular el clic de cualquier elemento. El siguiente ejemplo de Selenium Java muestra cómo se utilizó click () para hacer clic en el botón "Iniciar sesión" de Mercury Tours.
Se deben tener en cuenta las siguientes cosas al utilizar el método click ().
- No toma ningún parámetro / argumento.
- El método espera automáticamente a que se cargue una nueva página, si corresponde.
- El elemento sobre el que se va a hacer clic debe ser visible (la altura y el ancho no deben ser iguales a cero)
Obtener comandos
Los comandos de obtención obtienen información importante sobre la página / elemento. Aquí hay algunos comandos "get" importantes con los que debe estar familiarizado.
Comandos | Uso |
---|---|
get () Uso de muestra: |
|
getTitle () Uso de muestra: |
|
getPageSource () Uso de muestra: |
|
getCurrentUrl () Uso de muestra: |
|
getText () Uso de muestra: |
|
Navegar comandos
Estos comandos le permiten actualizar, ingresar y alternar entre diferentes páginas web.
navigate (). to () Uso de muestra: |
|
navigate (). refresh () Uso de muestra: |
|
navigate (). back () Uso de muestra: |
|
navigate (). forward () Uso de muestra: |
|
Cerrar y salir de las ventanas del navegador
close () Uso de muestra: |
|
quit () Uso de muestra: |
|
Para ilustrar claramente la diferencia entre close () y quit (), intente ejecutar el siguiente código. Utiliza una página web que abre automáticamente una ventana al cargar la página y abre otra después de salir.
Observe que solo se cerró la ventana del navegador principal y no las dos ventanas emergentes.
Pero si usa quit (), todas las ventanas se cerrarán, no solo la principal. Intente ejecutar el código a continuación y notará que las dos ventanas emergentes de arriba también se cerrarán automáticamente.
paquete newproject;importar org.openqa.selenium.WebDriver;importar org.openqa.selenium.firefox.FirefoxDriver;clase pública PG3 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Controlador WebDriver = nuevo FirefoxDriver ();driver.get ("http://www.popuptest.com/popuptest2.html");driver.quit (); // usando SALIR se cerrarán todas las ventanas}}
Cambiar entre fotogramas
Para acceder a los elementos de la GUI en un marco, primero debemos indicar a WebDriver que se centre en el marco o la ventana emergente antes de poder acceder a los elementos dentro de ellos. Tomemos, por ejemplo, la página web http://demo.guru99.com/selenium/deprecated.html
Esta página tiene 3 marcos cuyos atributos de "nombre" se indican arriba. Deseamos acceder al enlace "En desuso" que se encuentra arriba en un círculo en amarillo. Para hacer eso, primero debemos indicarle a WebDriver que cambie al marco "classFrame" usando el método "switchTo (). Frame ()" . Usaremos el atributo de nombre del marco como parámetro para la parte "marco ()".
paquete newproject;import org.openqa.selenium.By;importar org.openqa.selenium.WebDriver;importar org.openqa.selenium.firefox.FirefoxDriver;clase pública PG4 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Controlador WebDriver = nuevo FirefoxDriver ();driver.get ("http://demo.guru99.com/selenium/deprecated.html");driver.switchTo (). frame ("classFrame");driver.findElement (By.linkText ("Obsoleto")). click ();driver.close ();}}
Después de ejecutar este código, verá que el marco "classFrame" se lleva a la página "API obsoleta", lo que significa que nuestro código pudo acceder con éxito al enlace "Desaprobado".
Cambiar entre ventanas emergentes
WebDriver permite que se muestren ventanas emergentes como alertas, a diferencia de Selenium IDE. Para acceder a los elementos dentro de la alerta (como el mensaje que contiene), debemos usar el método "switchTo (). Alert ()" . En el siguiente código, usaremos este método para acceder al cuadro de alerta y luego recuperar su mensaje usando el método "getText ()" , y luego cerrar automáticamente el cuadro de alerta usando el "switchTo (). Alert (). Accept () " método.
Primero, dirígete a http://jsbin.com/usidix/1 y haz clic manualmente en "¡Ir!" abotone allí y vea por sí mismo el texto del mensaje.
Veamos el código de ejemplo de Selenium para hacer esto-
paquete mypackage;import org.openqa.selenium.By;importar org.openqa.selenium.WebDriver;importar org.openqa.selenium.firefox.FirefoxDriver;public class myclass {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Controlador WebDriver = nuevo FirefoxDriver ();String alertMessage = "";driver.get ("http://jsbin.com/usidix/1");driver.findElement (By.cssSelector ("input [value = \" Go! \ "]")). click ();alertMessage = driver.switchTo (). alert (). getText ();driver.switchTo (). alert (). accept ();System.out.println (alertMessage);driver.quit ();}}
En la consola de Eclipse, observe que el mensaje de alerta impreso es:
Murga
Hay dos tipos de esperas.
- Espera implícita: se utiliza para establecer el tiempo de espera predeterminado en todo el programa.
- Espera explícita: se usa para establecer el tiempo de espera solo para una instancia en particular
Espera implícita
- Es más sencillo codificar que las esperas explícitas.
- Por lo general, se declara en la parte de creación de instancias del código.
- Solo necesitará un paquete adicional para importar.
Para comenzar a usar una espera implícita, tendría que importar este paquete a su código.
Luego, en la parte de creación de instancias de su código, agregue esto.
Espera explícita
Las esperas explícitas se realizan mediante las clases WebDriverWait y ExpectedCondition . Para el siguiente ejemplo de Selenium WebDriver, esperaremos hasta 10 segundos para que un elemento cuya identificación sea "nombre de usuario" sea visible antes de continuar con el siguiente comando. Estos son los pasos.
Paso 1
Importa estos dos paquetes:
Paso 2
Declare una variable WebDriverWait. En este ejemplo, usaremos "myWaitVar" como el nombre de la variable.
Paso 3
Utilice myWaitVar con ExpectedConditions en las partes en las que necesite que se produzca la espera explícita. En este caso, usaremos la espera explícita en la entrada de "nombre de usuario" (Página de inicio de Mercury Tours) antes de escribir el texto "tutorial" en ella.
Condiciones
Los siguientes métodos se utilizan en operaciones condicionales y de bucle:
- isEnabled () se usa cuando desea verificar si un elemento determinado está habilitado o no antes de ejecutar un comando.
- isDisplayed () se usa cuando desea verificar si un determinado elemento se muestra o no antes de ejecutar un comando.
- isSelected () se usa cuando desea verificar si una determinada casilla de verificación, botón de opción u opción en un cuadro desplegable está seleccionada. No funciona con otros elementos.
Uso de condiciones esperadas
La clase ExpectedConditions ofrece un conjunto más amplio de condiciones que puede usar junto con el método until () de WebDriverWait.
A continuación se muestran algunos de los métodos de ExpectedConditions más comunes.
- alertIsPresent () : espera hasta que se muestre un cuadro de alerta.
- elementToBeClickable () : espera hasta que un elemento es visible y, al mismo tiempo, habilitado. El código de selenio de muestra a continuación esperará hasta que el elemento con se vuelva visible y habilitado antes de asignar ese elemento como una variable WebElement llamada "txtUserName".
- frameToBeAvailableAndSwitchToIt () : espera hasta que el marco dado ya esté disponible y luego cambia automáticamente a él.
Captura de excepciones
Cuando se usa isEnabled (), isDisplayed () e isSelected (), WebDriver asume que el elemento ya existe en la página. De lo contrario, arrojará una NoSuchElementException . Para evitar esto, debemos usar un bloque try-catch para que el programa no se interrumpa.
WebElement txtbox_username = driver.findElement (By.id ("nombre de usuario"));tratar{if (txtbox_username.isEnabled ()) {txtbox_username.sendKeys ("tutorial");}}catch (NoSuchElementException nsee) {System.out.println (nsee.toString ());}
Si usa esperas explícitas, el tipo de excepción que debe detectar es la "TimeoutException".
Resumen
- Para comenzar a utilizar la API de WebDriver, debe importar al menos estos dos paquetes.
- org.openqa.selenium. *
- org.openqa.selenium.firefox.FirefoxDriver
- El método get () es el equivalente al comando "abrir" de Selenium IDE.
- La ubicación de elementos en WebDriver se realiza mediante el método findElement () .
- Las siguientes son las opciones disponibles para ubicar elementos en WebDriver:
- Por. nombre de la clase
- Por. cssSelector
- Por. identificación
- Por. Texto del enlace
- Por. nombre
- Por. parcialLinkText
- Por. tagName
- Por. xpath
- By.cssSelector () no admite la función "contiene" .
- Puede crear una instancia de un elemento utilizando la clase WebElement .
- Hacer clic en un elemento se realiza mediante el método de clic () .
- WebDriver proporciona estos útiles comandos de obtención :
- obtener()
- getTitle ()
- getPageSource ()
- getCurrentUrl ()
- getText ()
- WebDriver proporciona estos útiles comandos de navegación
- navegar (). adelante ()
- navegar (). atrás ()
- navegar a()
- navegar (). actualizar ()
- Los métodos close () y quit () se utilizan para cerrar las ventanas del navegador. Close () se usa para cerrar una sola ventana; while quit () se usa para cerrar todas las ventanas asociadas a la ventana principal que el objeto WebDriver estaba controlando.
- Los métodos switchTo (). Frame () y switchTo (). Alert () se utilizan para dirigir el enfoque de WebDriver a un marco o alerta, respectivamente.
- Las esperas implícitas se usan para establecer el tiempo de espera a lo largo del programa, mientras que las esperas explícitas se usan solo en partes específicas.
- Puede utilizar los métodos isEnabled (), isDisplayed (), isSelected () y una combinación de los métodos WebDriverWait y ExpectedConditions al verificar el estado de un elemento. Sin embargo, no verifican si el elemento no existe.
- Cuando se llamó a isEnabled (), isDisplayed () o isSelected () mientras el elemento no existía, WebDriver lanzará una NoSuchElementException .
- Cuando se llamaba a los métodos WebDriverWait y ExpectedConditions mientras el elemento no existía, WebDriver lanzaba una TimeoutException .
Nota:
driver.get (): se usa para ir al sitio web en particular, pero no mantiene el historial del navegador y las cookies, por lo que no podemos usar el botón de avance y retroceso, si hacemos clic en él, la página no obtendrá la programación
driver.navigate (): se usa para ir al sitio web en particular, pero mantiene el historial del navegador y las cookies, por lo que podemos usar el botón de avance y retroceso para navegar entre las páginas durante la codificación de Testcase