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.
- Colete todos os links da página da web com base na tag.
- Envie a solicitação HTTP para o link e leia o código de resposta HTTP.
- Descubra se o link é válido ou quebrado com base no código de resposta HTTP.
- 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.
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().
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.