Cómo encontrar enlaces rotos en Selenium

⚡ Resumen inteligente

Encontrar enlaces rotos en Selenium WebDriver implica recopilar cada etiqueta de anclaje y enviar una solicitud HTTP HEAD a cada una. URLy leyendo el código de respuesta. Los enlaces que devuelven 400 o superior se marcan como rotos, mientras que los enlaces válidos devuelven códigos 2xx.

  • 🔗 Definición: Un enlace roto es un URL que no se puede alcanzar, devolviendo normalmente un error 4xx o 5xx.
  • 🧭 Por qué importa: Los enlaces rotos perjudican la experiencia del usuario y el SEO, por lo que las comprobaciones automatizadas sustituyen a la verificación manual, que es más lenta.
  • 📥 Recopilar enlaces: Utilice findElements con By.tagName(“a”) para recopilar todos los elementos de anclaje de la página en una lista.
  • 📡 Enviar solicitud HEAD: Abra un HttpURLConexión, establezca el método en HEAD y lea el código de respuesta por URL.
  • Validar estado: Considere un código de respuesta de 400 o superior como un enlace roto y cualquier código 2xx como un enlace que funciona.

Cómo encontrar enlaces rotos en Selenium

¿Qué son los enlaces rotos?

Los enlaces rotos son enlaces o URLque no son accesibles. Pueden estar caídos o no funcionar debido a algún error del servidor.

A URL Siempre tendrá un estado 2xx, que es válido. Existen diferentes códigos de estado HTTP con distintos propósitos. Para una solicitud no válida, el estado HTTP es 4xx y 5xx.

La clase de códigos de estado 4xx se utiliza principalmente para errores del lado del cliente, y la clase de códigos de estado 5xx se utiliza 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 debes asegurarte de que no haya enlaces rotos en el sitio, ya que el usuario no debería llegar 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 comprobación manual de los enlaces es una tarea tediosa, ya que cada página web puede tener un gran número 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.

  1. Recopilar todos los enlaces de la página web según la etiqueta.
  2. Envía una solicitud HTTP para el enlace y lee el código de respuesta HTTP.
  3. Averigua si el enlace es válido o está roto según el código de respuesta HTTP.
  4. Repita esto para todos los enlaces capturados.

Code Encontrar los 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

Identifica todos los enlaces de una página web y guárdalos en una lista.

List<WebElement> links = driver.findElements(By.tagName("a"));

Obtén un iterador para recorrer la lista.

Iterator<WebElement> it = links.iterator();

Paso 3: Identificación y validación URL

En esta parte comprobaremos si un URL pertenece a un dominio de terceros o si el URL está vacío/nulo.

Obtén el atributo href de la etiqueta de anclaje y guárdalo en la variable url.

url = it.next().getAttribute("href");

Verifica si el URL es nulo o vacío y omitir 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 el URL Pertenece a un dominio principal o a un dominio de terceros. Si pertenece a un dominio de terceros, omita los pasos restantes.

 if(!url.startsWith(homePage)){
           System.out.println("URL belongs to another domain, skipping it.");
           continue;
   }

Paso 4: Enviar solicitud HTTP

El HttpURLLa clase Connection tiene métodos para enviar una solicitud HTTP y capturar el código de respuesta HTTP. Por lo tanto, la salida del método openConnection() (URLConnection) se convierte a tipo HttpURLConexión.

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 con la URL y se envía la solicitud.

huc.connect();

Paso 5: Validar enlaces

Usando getResponseCode() método, podemos obtener el código de respuesta para la solicitud.

respCode = huc.getResponseCode();

En función del código de respuesta, intentaremos comprobar el estado del enlace.

if(respCode >= 400){
        System.out.println(url+" is a broken link");
}
else{
        System.out.println(url+" is a valid link");
}

De esta forma, podemos obtener todos los enlaces de una página web e imprimir si los enlaces son válidos o están rotos.

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. Mediante un bucle for-each, se accede a cada elemento.

Obtenga TODOS los enlaces de una página web

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 = "https://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 las imágenes se realiza mediante los métodos By.cssSelector() y By.xpath().

Obtenga TODOS los enlaces de una página web

Solución de problemas

En un caso aislado, el primer enlace al que acceda el código podría ser el enlace de "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 controlador no podrá encontrar todos los demás enlaces en un navegador vacío. Por lo tanto, el IDE generará una excepción y el resto del código no se ejecutará. Esto se puede solucionar fácilmente con un bucle if.

Preguntas Frecuentes

Selenium recopila todas las etiquetas de anclaje y envía una solicitud HTTP HEAD a cada una. URLy marca como roto cualquier enlace que devuelva un código 400 o superior.

Un código 4xx indica un problema del lado del cliente, como una página que no aparece, mientras que un código 5xx indica un fallo del lado del servidor al procesar la solicitud.

Sí. Las fuentes de las imágenes se recopilan con By.cssSelector() o By.xpath(), y luego cada src URL se valida mediante su código de respuesta HTTP.

Sí. Los rastreadores basados ​​en IA escanean páginas, siguen enlaces y marcan los enlaces rotos o que redireccionan. URLs sin programación manual.

La IA supervisa el estado de los enlaces a lo largo del tiempo, predice fallos y sugiere reemplazos, lo que reduce la necesidad de realizar auditorías manuales repetitivas de los enlaces.

Resumir este post con: