Como encontrar links quebrados em Selenium

O que são links quebrados?

Links quebrados são links ou URLs que não são acessíveis. Eles podem estar inativos ou não funcionar devido a algum erro do servidor

Um URL sempre terá um status válido com 2xx. Existem diferentes códigos de status HTTP com finalidades diferentes. Para uma solicitação inválida, o status HTTP é 4xx e 5xx.

A classe 4xx de código de status é principalmente para erros do lado do cliente, e a classe 5xx de códigos de status é 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 se certificar de que não há links quebrados no site, pois o usuário não deve acessar 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, porque cada página da web pode ter um grande número de links e o processo manual deve 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 a solicitação HTTP para o link e leia o código de resposta HTTP.
  3. Descubra se o link é válido ou quebrado com base no código de resposta HTTP.
  4. Repita isso para todos os links capturados.

Código para 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 o Iterator para percorrer a lista.

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

Etapa 3: identificação e validação de URL

Nesta parte, verificaremos se o URL pertence ao domínio de terceiros ou se o URL está vazio/nulo.

Obtenha o href da tag âncora e armazene-o na variável url.

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

Verifique se o URL é nulo ou vazio e pule as etapas restantes se a condição for satisfeita.

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 terceiros. Pule as etapas 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

A classe HttpURLConnection possui métodos para enviar solicitação HTTP e capturar código de resposta HTTP. Portanto, a saída do método openConnection() (URLConnection) é convertida em tipo para HttpURLConnection.

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 o URL é estabelecida e a solicitação é enviada.

huc.connect();

Etapa 5: Validando Links

Usando o método getResponseCode() 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");
}

Assim, podemos obter todos os links da página web e imprimir se os links são válidos ou quebrados.

Espero que este tutorial ajude você a verificar links quebrados usando selênio.

Como obter TODOS os links de uma página da Web

Um dos procedimentos comuns na web Ensaios é 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 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 = "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();			
    }		
}

A saída deve ser semelhante à indicada abaixo.

  • O acesso aos links de 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

Num caso isolado, o primeiro link acessado pelo código poderia ser o Link “Home”. Nesse caso, a ação driver.navigate.back() mostrará 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, o IDE lançará uma exceção e o restante do código não será executado. Isso pode ser facilmente resolvido usando um loop If.