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.
- Colete todos os links na 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 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 {driver WebDriver estático privado = null;public static void main (String [] args) {// TODO stub do método gerado automaticamenteString homePage = "http://www.zlti.com";String url = "";HttpURLConnection huc = null;int respCode = 200;driver = novo ChromeDriver ();driver.manage (). window (). maximize ();driver.get (homePage);Listar 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 não está configurado para tag âncora ou está vazio");Prosseguir;}if (! url.startsWith (homePage)) {System.out.println ("URL pertence a outro domínio, pulando-o.");Prosseguir;}tentar {huc = (HttpURLConnection) (novo URL (url) .openConnection ());huc.setRequestMethod ("HEAD");huc.connect ();respCode = huc.getResponseCode ();if (respCode> = 400) {System.out.println (url + "é um link quebrado");}outro{System.out.println (url + "é um link válido");}} catch (MalformedURLException e) {// TODO bloco de captura gerado automaticamentee.printStackTrace ();} catch (IOException e) {// TODO bloco de captura gerado automaticamentee.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.
Listar links= driver.findElements (By.tagName ("a"));
Obtenha o Iterator para percorrer a Lista.
Iteratorit = 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 não está configurado para tag âncora ou está vazio");Prosseguir;}
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 pertence a outro domínio, pulando-o.");Prosseguir;}
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) (novo 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 + "é um link quebrado");}outro{System.out.println (url + "é um link válido");}
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 do Java for-each loop , método findElements () e By.tagName ("a") .
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 = "http://demo.guru99.com/test/newtours/";System.setProperty ("webdriver.chrome.driver", "G: \\ chromedriver.exe");Driver WebDriver = novo ChromeDriver ();String underConsTitle = "Em construção: Mercury Tours";driver.manage (). timeouts (). implicitlyWait (5, TimeUnit.SECONDS);driver.get (baseUrl);ListlinkElements = driver.findElements (By.tagName ("a"));String [] linkTexts = novo String [linkElements.size ()];int i = 0;// extraia os textos do link de cada elemento do linkpara (WebElement e: linkElements) {linkTexts [i] = e.getText ();i ++;}// teste cada linkpara (String t: linkTexts) {driver.findElement (By.linkText (t)). click ();if (driver.getTitle (). equals (underConsTitle)) {System.out.println ("\" "+ t +" \ ""+ "está em construção.");} outro {System.out.println ("\" "+ t +" \ ""+ "está funcionando.");}driver.navigate (). back ();}driver.quit ();}}
A saída deve ser semelhante à indicada abaixo.
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.