Como encontrar links / links quebrados usando o Selenium Webdriver

O que são links quebrados?

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

Um URL sempre terá um status com 2xx, que é válido. 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 o erro de resposta do servidor.

Provavelmente não poderemos 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 haja links quebrados no site, pois o usuário não deve cair em uma página de erro.

O erro ocorre se as regras não são atualizadas corretamente ou os recursos solicitados não existem 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

Para verificar os links quebrados, você precisará seguir os seguintes passos.

  1. Colete todos os links na página da web com base em marcação.
  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 os 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 links = driver.findElements(By.tagName('a')); Iterator 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 exemplo de código

Etapa 1: importar pacotes

Importe o pacote abaixo, além dos pacotes padrão:

import java.net.HttpURLConnection;

Usando os métodos neste pacote, podemos enviar solicitações HTTP e capturar códigos de resposta HTTP da resposta.

Etapa 2: Colete todos os links na página da web

Identifique todos os links em uma página da web e armazene-os na Lista.

List links = driver.findElements(By.tagName('a'));

Obtenha o Iterator para percorrer a Lista.

Iterator 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 tem métodos para enviar solicitação HTTP e capturar o 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 no teste da web é testar se todos os links presentes na página estão funcionando. Isso pode ser feito convenientemente usando uma combinação de Java para cada loop , findElements () E By.tagName ('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.

O código WebDriver abaixo verifica cada link da página inicial da Mercury Tours 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.on2vhf.be/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 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 ().
  • Solução de problemas

    Em um 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 vazio. Portanto, o IDE lançará uma exceção e o restante do código não será executado. Isso pode ser facilmente tratado usando um loop If.