Cómo encontrar enlaces rotos en Selenium
¿Qué son los enlaces rotos?
Los enlaces rotos son enlaces o URL a los que no se puede acceder. Es posible que estén caídos o no funcionando debido a algún error del servidor.
Una URL siempre tendrá un estado con 2xx que sea válido. Existen diferentes códigos de estado HTTP que tienen diferentes propósitos. Para una solicitud no válida, el estado HTTP es 4xx y 5xx.
La clase de código de estado 4xx es principalmente para errores del lado del cliente, y la clase de códigos de estado 5xx es principalmente para errores de respuesta del servidor.
Lo más probable es que no podamos confirmar si ese enlace funciona o no hasta que hagamos clic y lo confirmemos.
¿Por qué deberías comprobar los enlaces rotos?
Siempre debe asegurarse de que no haya enlaces rotos en el sitio porque el usuario no debería acceder a una página de error.
El error ocurre si las reglas no se actualizan correctamente o los recursos solicitados no existen en el servidor.
La verificación manual de enlaces es una tarea tediosa, porque cada página web puede tener una gran cantidad de enlaces y el proceso manual debe repetirse para todas las páginas.
Un script de automatización que utiliza Selenium que automatizará el proceso es una solución más adecuada.
Cómo comprobar los enlaces rotos y las imágenes en Selenium
Para comprobar los enlaces rotos, deberá realizar los siguientes pasos.
- Recopile todos los enlaces de la página web según la etiqueta .
- Envíe una solicitud HTTP para el enlace y lea el código de respuesta HTTP.
- Descubra si el enlace es válido o está roto según el código de respuesta HTTP.
- Repita esto para todos los enlaces capturados.
Código para encontrar enlaces rotos en una página web
A continuación se muestra el código del controlador web que prueba nuestro caso de uso:
package automationPractice; import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.Iterator; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class BrokenLinks { private static WebDriver driver = null; public static void main(String[] args) { // TODO Auto-generated method stub String homePage = "http://www.zlti.com"; String url = ""; HttpURLConnection huc = null; int respCode = 200; driver = new ChromeDriver(); driver.manage().window().maximize(); driver.get(homePage); List<WebElement> links = driver.findElements(By.tagName("a")); Iterator<WebElement> it = links.iterator(); while(it.hasNext()){ url = it.next().getAttribute("href"); System.out.println(url); if(url == null || url.isEmpty()){ System.out.println("URL is either not configured for anchor tag or it is empty"); continue; } if(!url.startsWith(homePage)){ System.out.println("URL belongs to another domain, skipping it."); continue; } try { huc = (HttpURLConnection)(new URL(url).openConnection()); huc.setRequestMethod("HEAD"); huc.connect(); respCode = huc.getResponseCode(); if(respCode >= 400){ System.out.println(url+" is a broken link"); } else{ System.out.println(url+" is a valid link"); } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } driver.quit(); } }
Explicando el código de enlaces rotos
Paso 1: importar paquetes
Importe el siguiente paquete además de los paquetes predeterminados:
import java.net.HttpURLConnection;
Usando los métodos de este paquete, podemos enviar solicitudes HTTP y capturar códigos de respuesta HTTP de la respuesta.
Paso 2: recopile todos los enlaces en la página web
Identifique todos los enlaces en una página web y guárdelos en la Lista.
List<WebElement> links = driver.findElements(By.tagName("a"));
Obtenga Iterator para recorrer la Lista.
Iterator<WebElement> it = links.iterator();
Paso 3: Identificar y validar la URL
En esta parte, comprobaremos si la URL pertenece a un dominio de terceros o si la URL está vacía/nula.
Obtenga href de la etiqueta de anclaje y guárdela en la variable URL.
url = it.next().getAttribute("href");
Compruebe si la URL es nula o está vacía y omita los pasos restantes si se cumple la condición.
if(url == null || url.isEmpty()){ System.out.println("URL is either not configured for anchor tag or it is empty"); continue; }
Compruebe si la URL pertenece a un dominio principal o a un tercero. Omita los pasos restantes si pertenece a un dominio de terceros.
if(!url.startsWith(homePage)){ System.out.println("URL belongs to another domain, skipping it."); continue; }
Paso 4: enviar solicitud http
La clase HttpURLConnection tiene métodos para enviar solicitudes HTTP y capturar el código de respuesta HTTP. Por lo tanto, la salida del método openConnection() (URLConnection) se convierte en tipo a HttpURLConnection.
huc = (HttpURLConnection)(new URL(url).openConnection());
Podemos configurar el tipo de solicitud como "HEAD" en lugar de "GET". De modo que solo se devuelvan los encabezados y no el cuerpo del documento.
huc.setRequestMethod("HEAD");
Al invocar el método connect(), se establece la conexión real a la URL y se envía la solicitud.
huc.connect();
Paso 5: Validar enlaces
Usando el método getResponseCode() podemos obtener el código de respuesta para la solicitud
respCode = huc.getResponseCode();
Según el código de respuesta, intentaremos verificar el estado del enlace.
if(respCode >= 400){ System.out.println(url+" is a broken link"); } else{ System.out.println(url+" is a valid link"); }
Por lo tanto, podemos obtener todos los enlaces de la página web e imprimir si los enlaces son válidos o no.
Esperamos que este tutorial te ayude a comprobar enlaces rotos usando Selenium.
Cómo obtener TODOS los enlaces de una página web
Uno de los procedimientos habituales en la web. Pruebas es probar si todos los enlaces presentes dentro de la página están funcionando. Esto se puede hacer convenientemente usando una combinación de Java para cada bucle, buscarElementos() & Por.nombredeetiqueta(“a”) método.
El método findElements() devuelve una lista de elementos web con la etiqueta a. Utilizando un bucle for-each, se accede a cada elemento.
El código WebDriver siguiente comprueba cada enlace del Mercury Página de inicio de tours para determinar los que están funcionando y los que aún están en construcción.
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import java.util.List; import java.util.concurrent.TimeUnit; import org.openqa.selenium.*; public class P1 { public static void main(String[] args) { String baseUrl = "http://demo.guru99.com/test/newtours/"; System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); String underConsTitle = "Under Construction: Mercury Tours"; driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); driver.get(baseUrl); List<WebElement> linkElements = driver.findElements(By.tagName("a")); String[] linkTexts = new String[linkElements.size()]; int i = 0; //extract the link texts of each link element for (WebElement e : linkElements) { linkTexts[i] = e.getText(); i++; } //test each link for (String t : linkTexts) { driver.findElement(By.linkText(t)).click(); if (driver.getTitle().equals(underConsTitle)) { System.out.println("\"" + t + "\"" + " is under construction."); } else { System.out.println("\"" + t + "\"" + " is working."); } driver.navigate().back(); } driver.quit(); } }
El resultado debe ser similar al que se indica a continuación.
- El acceso a los enlaces de imágenes se realiza mediante los métodos By.cssSelector() y By.xpath().
Solución de problemas
En un caso aislado, el primer enlace al que accede el código podría ser el enlace “Inicio”. En tal caso, la acción driver.navigate.back() mostrará una página en blanco ya que la primera acción es abrir un navegador. El conductor no podrá encontrar todos los demás enlaces en un navegador en blanco. Entonces IDE generará una excepción y el resto del código no se ejecutará. Esto se puede manejar fácilmente usando un bucle If.