Como encontrar links quebrados em Selenium

โšก Resumo Inteligente

Encontrando links quebrados em Selenium O WebDriver envolve a coleta de todas as tags de รขncora e o envio de uma solicitaรงรฃo HTTP HEAD para cada uma delas. URLe lendo o cรณdigo de resposta. Links que retornam 400 ou mais sรฃo sinalizados como quebrados, enquanto links vรกlidos retornam cรณdigos 2xx.

  • ๐Ÿ”— Definiรงรฃo: Um link quebrado รฉ um URL que nรฃo pode ser alcanรงado, geralmente retornando um erro 4xx ou 5xx.
  • ๐Ÿงญ Por que isso importa: Links quebrados prejudicam a experiรชncia do usuรกrio e o SEO, por isso verificaรงรตes automatizadas substituem a verificaรงรฃo manual lenta.
  • ๐Ÿ“ฅ Coletar links: Use findElements com By.tagName(โ€œaโ€) para reunir todos os elementos de รขncora da pรกgina em uma lista.
  • ๐Ÿ“ก Enviar solicitaรงรฃo HEAD: Abra um HttpURLConecte-se, defina o mรฉtodo como HEAD e leia o cรณdigo de resposta por URL.
  • โœ… Validar status: Considere um cรณdigo de resposta 400 ou superior como link quebrado e qualquer cรณdigo 2xx como link funcional.

Como encontrar links quebrados em Selenium

O que sรฃo links quebrados?

Links quebrados sรฃo links ou URLServidores que nรฃo estรฃo acessรญveis. Eles podem estar fora do ar ou nรฃo funcionar devido a algum erro no servidor.

A URL A requisiรงรฃo sempre terรก um status 2xx, que รฉ vรกlido. Existem diferentes cรณdigos de status HTTP com diferentes finalidades. Para uma requisiรงรฃo invรกlida, o status HTTP รฉ 4xx ou 5xx.

Os cรณdigos de status da classe 4xx sรฃo usados โ€‹โ€‹principalmente para erros do lado do cliente, enquanto os cรณdigos da classe 5xx sรฃo usados โ€‹โ€‹principalmente para erros de resposta do servidor.

Provavelmente nรฃo conseguiremos confirmar se esse link estรก funcionando ou nรฃo atรฉ clicarmos e confirmarmos.

Por que vocรช deve verificar links quebrados?

Vocรช deve sempre verificar se nรฃo hรก links quebrados no site, pois o usuรกrio nรฃo deve ser direcionado para uma pรกgina de erro.

O erro ocorre se as regras nรฃo forem atualizadas corretamente ou se os recursos solicitados nรฃo existirem no servidor.

A verificaรงรฃo manual de links รฉ uma tarefa tediosa, pois cada pรกgina da web pode ter um grande nรบmero de links e o processo manual precisa ser repetido para todas as pรกginas.

Um script de automaรงรฃo usando Selenium que irรก automatizar o processo รฉ uma soluรงรฃo mais adequada.

Como verificar links quebrados e imagens em Selenium

Para verificar os links quebrados, vocรช precisarรก seguir os seguintes passos.

  1. Colete todos os links da pรกgina da web com base na tag.
  2. Envie uma solicitaรงรฃo HTTP para o link e leia o cรณdigo de resposta HTTP.
  3. Descubra se o link รฉ vรกlido ou estรก quebrado com base no cรณdigo de resposta HTTP.
  4. Repita isso para todos os links capturados.

Code Encontrar links quebrados em uma pรกgina da web

Abaixo estรก o cรณdigo do driver da web que testa nosso 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 o cรณdigo de links quebrados

Etapa 1: importar pacotes

Importe o pacote abaixo alรฉm dos pacotes padrรฃo:

import java.net.HttpURLConnection;

Usando os mรฉtodos deste pacote, podemos enviar solicitaรงรตes HTTP e capturar cรณdigos de resposta HTTP da resposta.

Etapa 2: colete todos os links da pรกgina da web

Identifique todos os links em uma pรกgina da web e armazene-os em uma lista.

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

Obtenha um iterador para percorrer a lista.

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

Etapa 3: Identificaรงรฃo e Validaรงรฃo URL

Nesta parte, vamos verificar se um URL pertence a um domรญnio de terceiros ou se o URL estรก vazio/nulo.

Obtenha o href da tag de รขncora e armazene-o na variรกvel url.

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

Verifique se o URL se for nulo ou vazio, ignore os passos restantes.

if(url == null || url.isEmpty()){
              System.out.println("URL is either not configured for anchor tag or it is empty");
              continue;
     }

Verifique se o URL Pertence a um domรญnio principal ou a um domรญnio de terceiros. Ignore os passos restantes se pertencer a um domรญnio de terceiros.

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

Etapa 4: Enviar solicitaรงรฃo HTTP

O HttpURLA classe Connection possui mรฉtodos para enviar uma solicitaรงรฃo HTTP e capturar o cรณdigo de resposta HTTP. Portanto, a saรญda do mรฉtodo openConnection() (URLA conexรฃo) รฉ convertida para o tipo HttpURLConexรฃo.

huc = (HttpURLConnection)(new URL(url).openConnection());

Podemos definir o tipo de solicitaรงรฃo como โ€œHEADโ€ em vez de โ€œGETโ€, para que apenas os cabeรงalhos sejam retornados e nรฃo o corpo do documento.

huc.setRequestMethod("HEAD");

Ao invocar o mรฉtodo connect(), a conexรฃo real com a URL รฉ estabelecida e a solicitaรงรฃo รฉ enviada.

huc.connect();

Etapa 5: Validando Links

Usando o getResponseCode() mรฉtodo, podemos obter o cรณdigo de resposta para a solicitaรงรฃo.

respCode = huc.getResponseCode();

Com base no cรณdigo de resposta, tentaremos verificar o status do link.

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

Dessa forma, podemos obter todos os links de uma pรกgina da web e verificar se os links sรฃo vรกlidos ou estรฃo quebrados.

Como obter TODOS os links de uma pรกgina da Web

Um dos procedimentos comuns na web Testes รฉ testar se todos os links presentes na pรกgina estรฃo funcionando. Isto pode ser feito convenientemente usando uma combinaรงรฃo dos Java para cada loop, encontrarElementos() & Por.tagNome(โ€œaโ€) mรฉtodo.

O mรฉtodo findElements() retorna uma lista de elementos da Web com a tag a. Usando um loop for-each, cada elemento รฉ acessado.

Obtenha TODOS os links de uma pรกgina da web

O cรณdigo WebDriver abaixo verifica cada link do Mercury Pรกgina inicial do Tour para determinar aqueles que estรฃo funcionando e aqueles que ainda estรฃo em construรงรฃo.

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();
    }
}

A saรญda deve ser semelhante ร  indicada abaixo.

  • O acesso aos links das imagens รฉ feito usando os mรฉtodos By.cssSelector() e By.xpath().

Obtenha TODOS os links de uma pรกgina da web

Soluรงรฃo de problemas

Em um caso isolado, o primeiro link acessado pelo cรณdigo pode ser o link "Home". Nesse caso, a aรงรฃo `driver.navigate.back()` exibirรก uma pรกgina em branco, pois a primeira aรงรฃo รฉ abrir um navegador. O driver nรฃo conseguirรก encontrar todos os outros links em um navegador em branco. Portanto, a IDE lanรงarรก uma exceรงรฃo e o restante do cรณdigo nรฃo serรก executado. Isso pode ser facilmente tratado usando um laรงo `if`.

Perguntas Frequentes

Selenium Coleta todas as tags de รขncora e envia uma solicitaรงรฃo HTTP HEAD para cada uma delas. URLe marca como quebrado qualquer link que retorne 400 ou mais.

Um cรณdigo 4xx indica um problema do lado do cliente, como uma pรกgina ausente, enquanto um cรณdigo 5xx indica uma falha do lado do servidor durante o processamento da solicitaรงรฃo.

Sim. As fontes de imagem sรฃo coletadas com `By.cssSelector()` ou `By.xpath()`, e entรฃo cada `src` รฉ adicionado. URL รฉ validado atravรฉs do seu cรณdigo de resposta HTTP.

Sim. Os rastreadores baseados em IA examinam pรกginas, seguem links e sinalizam links quebrados ou com redirecionamento. URLs sem necessidade de programaรงรฃo manual.

A IA monitora a integridade das conexรตes ao longo do tempo, prevรช falhas e sugere substituiรงรตes, reduzindo as auditorias manuais repetidas das conexรตes.

Resuma esta postagem com: