Selenium Webdriver es una colección de API de código abierto que se utiliza para probar aplicaciones web. La herramienta Selenium Webdriver se utiliza para automatizar las pruebas de aplicaciones web para verificar que funcionan como se espera. Es compatible principalmente con navegadores como Firefox, Chrome, Opera, Safari e Internet Explorer. También permite ejecutar pruebas en varios navegadores.
WebDriver también le permite utilizar un lenguaje de programación al crear sus scripts de prueba.
El uso de WebDriver no es únicamente para la automatización de pruebas en la web, también nos permite extraer información de forma automatizada. En nuestro caso lo utilizaremos para recopilar datos de diferentes páginas web.
maven y añadimos las siguientes dependencias en nuestro fichero pom.xml<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-remote-driver</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
Firefox, para ello bajaremos la última versión del driver, este driver llamado geckodriver es un fichero binario compilado para la plataforma en la que se va a ejecutar, en mi caso Linux, deberá ser accesible en nuestro proyecto Java y tener propiedades de ejecución.Main.java configura la ruta hasta el driver en la propiedad de sistema webdriver.gecko.driverimport org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
public class Main {
public static void main(String[] args) {
System.setProperty("webdriver.gecko.driver", "path/to/geckodriver");
FirefoxOptions options = new FirefoxOptions();
WebDriver driver = new FirefoxDriver(options);
driver.get("https://elpuig.xeill.net");
String title = driver.getTitle();
System.out.println(title);
driver.close();
}
}
Para comenzar, debemos importar los siguientes dos paquetes:
org.openqa.selenium.WebDriver: 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 WebDriverSi necesitas acciones más complicadas, como acceder a otra clase, tomar capturas de pantalla del navegador o manipular archivos externos, necesitarás importar más paquetes.
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).
Normalmente, así es como se crea una instancia de un objeto de controlador.
FirefoxOptions options = new FirefoxOptions();
WebDriver driver = new FirefoxDriver(options);
El método get() de WebDriver se utiliza para iniciar una nueva sesión de navegador y la dirige a la URL que se especifique como parámetro.
driver.get("https://elpuig.xeill.net");
La clase WebDriver tiene el método getTitle() que siempre se usa para obtener el título de la página cargada actualmente.
String title = driver.getTitle();
El método close() se utiliza para cerrar la ventana del navegador.
driver.close();
La localització d’elements a WebDriver es fa mitjançant el mètode findElement(By.locator()) . Es recomana que localitzeu els elements de la GUI mitjançant IDE i, un cop identificats correctament, exporteu el codi a WebDriver.
Aquí hi ha un codi de mostra de Selenium que localitza un element pel seu identificador. Facebook s’utilitza com a URL base.
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class Exemple {
public static void main(String[] args) {
System.setProperty("webdriver.gecko.driver", "src/main/resources/geckodriver");
FirefoxOptions options = new FirefoxOptions();
WebDriver driver = new FirefoxDriver(options);
String baseUrl = "http://www.facebook.com";
String tagName = "";
driver.get(baseUrl);
tagName = driver.findElement(By.id("email")).getTagName();
System.out.println(tagName);
driver.close();
System.exit(0);
}
}
Hem utilitzat el mètode getTagName() per extreure el nom de l’etiqueta d’aquest element en concret l’identificador del qual és email. Quan s’executa, aquest codi hauria de poder identificar correctament el nom de l’etiqueta “entrada” i l’imprimirà a la finestra de la consola del IDE.
Resum per localitzar elements
| Variation | Description | Sample |
|---|---|---|
By.className |
troba elements basats en el valor de l’atribut class |
findElement(By.className(“someClassName”)) |
By.cssSelector |
troba elements basats en el motor de selecció CSS subjacent del controlador | findElement(By.cssSelector(“input#email”)) |
By.id |
localitza els elements pel valor del seu atribut id |
findElement(By.id(“someId”)) |
By.linkText |
troba un element d’enllaç pel text exacte que mostra | findElement(By.linkText(“REGISTRATION”)) |
By.name |
localitza elements pel valor de l’atribut nom |
findElement(By.name(“someName”)) |
By.partialLinkText |
localitza els elements que contenen el text de l’enllaç donat | findElement(By.partialLinkText(“REG”)) |
By.tagName |
localitza els elements pel seu nom d’etiqueta | findElement(By.tagName(“div”)) |
By.xpath |
localitza elements mitjançant 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]”))` |
En lloc d’utilitzar la llarga sintaxi driver.findElement(By.locator()) cada vegada que accediu a un element concret, podem crear-hi una instancia d’un objecte WebElement. La classe WebElement està continguda al paquet org.openqa.selenium.*.
WebElement myElement = driver.findElement(By.id("username"));
myElement.sendKeys("tutorial");
El clic és potser la forma més habitual d’interactuar amb elements web. El mètode click() s’utilitza per simular el clic de qualsevol element. L’exemple següent de Selenium Java mostra com es va utilitzar click() per fer clic al botó Iniciar sessió.
driver.findElement(By.name("login")).click();
Cal tenir en compte les coses següents quan utilitzeu el mètode click().
Les ordres get obtenen informació important sobre la pàgina/element. Aquí hi ha algunes ordres importants get amb les quals heu d’estar familiaritzats.
| Ordres | Ús |
|——–|—-|
| get() | <ul><li>Obre automàticament una nova finestra del navegador i recupera la pàgina que especifiqueu entre els seus parèntesis.</li><li>És la contrapartida de l’ordre òpen de Selenium IDE.</li><li>El paràmetre ha de ser un objecte String.</li></ul> |
| getTitle() | <ul><li>No necessita paràmetres</li><li>Obtén el títol de la pàgina actual</li><li>Els espais en blanc inicials i posteriors es retallen</li><li>Retorna una cadena nul·la si la pàgina no té títol</li></ul> |
| getPageSource() | <ul><li>No necessita paràmetres</li><li>Retorna el codi font de la pàgina com a valor String</li></ul> |
| getCurrentUrl() | <ul><li>No necessita paràmetres</li><li>Obtén la cadena que representa l'URL actual que està mirant el navegador</li></ul> |
| getText()` | <ul><li>Obtén el text interior de l’element que especifiqueu</li></ul> |
Aquestes ordres us permeten actualitzar, entrar i canviar entre diferents pàgines web.
| Ordres | Ús |
|---|---|
navigate().to() |
<ul><li>Obre automàticament una nova finestra del navegador i recupera la pàgina que especifiqueu entre els seus parèntesis.</li><li>Fa exactament el mateix que el mètode get().</li></ul> |
navigate().refresh() |
<ul><li>No necessita paràmetres.</li><li>Actualitza la pàgina actual.</li></ul> |
navigate().back() |
<ul><li>No necessita paràmetres.</li><li>Et porta enrere una pàgina a l’historial del navegador.</li></ul> |
navigate().forward() |
<ul><li>No necessita paràmetres.</li><li>Us fa avançar una pàgina a l’historial del navegador.</li></ul> |
| Ordres | Ús |
|---|---|
| close() | <ul><li>No necessita paràmetres.</li><li>Tanca només la finestra del navegador que WebDriver controla actualment.</li></ul> |
| quit() | <ul><li>No necessita paràmetres.</li><li>Tanca totes les finestres que WebDriver ha obert.</li></ul> |
Hi ha dos tipus de waits.
Per començar a utilitzar una espera implícita, hauríeu d’importar aquest paquet al vostre codi.
import java.util.concurrent.TimeUnit;
A continuació, a la part d’instanciació del vostre codi, afegiu-ho.
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Les esperes explícites es fan mitjançant les classes WebDriverWait i ExpectedCondition. Per al següent exemple de Selenium WebDriver, esperarem fins a 10 segons perquè un element l’identificador del qual sigui “nom d’usuari” sigui visible abans de passar a la següent ordre. Aquí teniu els passos.
Pas 1 Importeu aquests dos paquets:
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
Pas 2
Declarar una variable WebDriverWait. En aquest exemple, utilitzarem myWaitVar com a nom de la variable.
WebDriver driver = new FirefoxDriver();
WebDriverWait myWaitVar = new WebDriverWait(driver, 10);
Pas 3
Utilitzeu myWaitVar amb ExpectedConditions a les parts on necessiteu que es produeixi l’espera explícita. En aquest cas, utilitzarem l’espera explícita a l’entrada del “nom d’usuari” abans d’escriure el text “tutorial”.
myWaitVar.until(ExpectedConditions.visibilityOfElementLocated(By.id("username")));
driver.findElement(By.id("username")).sendKeys("tutorial");
Els mètodes següents s’utilitzen en operacions condicionals i en bucle:
isEnabled() – s’utilitza quan voleu verificar si un determinat element està habilitat o no abans d’executar una ordre.isDisplayed() – s’utilitza quan voleu verificar si un determinat element es mostra o no abans d’executar una ordre.isSelected() – s’utilitza quan voleu verificar si una casella de selecció, botó d’opció o opció en un quadre desplegable està seleccionada. No funciona en altres elements.La classe ExpectedConditions ofereix un conjunt més ampli de condicions que podeu utilitzar juntament amb el mètode until() de WebDriverWait.
A continuació es mostren alguns dels mètodes ExpectedConditions més comuns.
alertIsPresent() – espera fins que es mostri un quadre d’alerta.elementToBeClickable() – Espera fins que un element sigui visible i, al mateix temps, habilitat. El codi Selenium de mostra a continuació esperarà fins que l’element amb id="username" es faci visible i s’habiliteu primer abans d’assignar aquest element com a variable WebElement anomenada "txtUserName".frameToBeAvailableAndSwitchToIt() – Espera fins que el marc donat ja estigui disponible i, a continuació, canvia automàticament a ell.Quan s’utilitza isEnabled(), isDisplayed() i isSelected(), WebDriver assumeix que l’element ja existeix a la pàgina. En cas contrari, llançarà una NoSuchElementException. Per evitar-ho, hauríem d’utilitzar un bloc try-catch perquè el programa no s’interrompi.
WebElement txtbox_username = driver.findElement(By.id("username"));
try {
if(txtbox_username.isEnabled()) {
txtbox_username.sendKeys("tutorial");
}
}
catch(NoSuchElementException nsee) {
System.out.println(nsee.toString());
}
Si utilitzeu esperes explícites, el tipus d’excepció que hauríeu de detectar és la TimeoutException.