¿Qué son los enlaces rotos?
Los enlaces rotos son enlaces o URL a los que no se puede acceder. Pueden estar inactivos o no funcionar debido a algún error del servidor
Una URL siempre tendrá un estado con 2xx que es válido. Hay diferentes códigos de estado HTTP que tienen diferentes propósitos. Para una solicitud no válida, el estado HTTP es 4xx y 5xx.
La clase 4xx de código de estado es principalmente para errores del lado del cliente, y la clase 5xx de códigos de estado es principalmente para errores de respuesta del servidor.
Lo más probable es que no podamos confirmar si ese enlace funciona o no hasta que hagamos clic y lo confirmemos.
¿Por qué debería comprobar los enlaces rotos?
Siempre debe asegurarse de que no haya enlaces rotos en el sitio porque el usuario no debe ingresar a una página de error.
El error ocurre si las reglas no se actualizan correctamente o los recursos solicitados no existen en el servidor.
La verificación manual de enlaces es una tarea tediosa, porque cada página web puede tener una gran cantidad de enlaces y el proceso manual debe repetirse para todas las páginas.
Una secuencia de comandos de automatización que utiliza Selenium que automatizará el proceso es una solución más adecuada.
Cómo comprobar los enlaces rotos y las imágenes
Para verificar los enlaces rotos, deberá seguir los siguientes pasos.
- Recopile todos los enlaces de la página web según la etiqueta .
- Envíe una solicitud HTTP para el enlace y lea el código de respuesta HTTP.
- Averigüe si el enlace es válido o no funciona según el código de respuesta HTTP.
- Repita esto para todos los enlaces capturados.
Código para encontrar los enlaces rotos en una página web
A continuación se muestra el código del controlador web que prueba nuestro 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;importar org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;importar org.openqa.selenium.chrome.ChromeDriver;enlaces rotos de clase pública {controlador WebDriver estático privado = nulo;public static void main (String [] args) {// TODO código auxiliar de método generado automáticamenteString homePage = "http://www.zlti.com";String url = "";HttpURLConnection huc = null;int respCode = 200;controlador = nuevo ChromeDriver ();driver.manage (). window (). maximizar ();driver.get (homePage);Lista de enlaces= driver.findElements (By.tagName ("a"));Iterador it = links.iterator ();while (it.hasNext ()) {url = it.next (). getAttribute ("href");System.out.println (url);if (url == null || url.isEmpty ()) {System.out.println ("La URL no está configurada para etiqueta de anclaje o está vacía");Seguir;}if (! url.startsWith (homePage)) {System.out.println ("La URL pertenece a otro dominio, saltándola");Seguir;}tratar {huc = (HttpURLConnection) (nueva URL (url) .openConnection ());huc.setRequestMethod ("HEAD");huc.connect ();respCode = huc.getResponseCode ();if (respCode> = 400) {System.out.println (url + "es un enlace roto");}demás{System.out.println (url + "es un enlace válido");}} captura (MalformedURLException e) {// TODO Bloque de captura generado automáticamentee.printStackTrace ();} captura (IOException e) {// TODO Bloque de captura generado automáticamentee.printStackTrace ();}}driver.quit ();}}
Explicando el ejemplo de código
Paso 1: Importar paquetes
Importe el siguiente paquete además de los paquetes predeterminados:
import java.net.HttpURLConnection;
Usando los métodos en este paquete, podemos enviar solicitudes HTTP y capturar códigos de respuesta HTTP de la respuesta.
Paso 2: recopila todos los enlaces en la página web
Identifique todos los enlaces en una página web y guárdelos en la Lista.
Lista de enlaces= driver.findElements (By.tagName ("a"));
Obtenga Iterador para recorrer la lista.
Iteradorit = links.iterator ();
Paso 3: identificación y validación de la URL
En esta parte, verificaremos si la URL pertenece a un dominio de terceros o si la URL está vacía / nula.
Obtenga href de la etiqueta de anclaje y guárdelo en la variable url.
url = it.next (). getAttribute ("href");
Compruebe si la URL es nula o está vacía y omita los pasos restantes si se cumple la condición.
if (url == null || url.isEmpty ()) {System.out.println ("La URL no está configurada para etiqueta de anclaje o está vacía");Seguir;}
Compruebe si la URL pertenece a un dominio principal o a un tercero. Omita los pasos restantes si pertenece a un dominio de terceros.
if (! url.startsWith (homePage)) {System.out.println ("La URL pertenece a otro dominio, saltándola");Seguir;}
Paso 4: envía la solicitud http
La clase HttpURLConnection tiene métodos para enviar solicitudes HTTP y capturar el código de respuesta HTTP. Por lo tanto, la salida del método openConnection () (URLConnection) se envía a HttpURLConnection.
huc = (HttpURLConnection) (nueva URL (url) .openConnection ());
Podemos establecer el tipo de solicitud como "HEAD" en lugar de "GET". Para que solo se devuelvan los encabezados y no el cuerpo del documento.
huc.setRequestMethod ("HEAD");
Al invocar el método connect (), se establece la conexión real a la URL y se envía la solicitud.
huc.connect ();
Paso 5: Validación de enlaces
Usando el método getResponseCode () podemos obtener el código de respuesta para la solicitud
respCode = huc.getResponseCode ();
Basándonos en el código de respuesta, intentaremos verificar el estado del enlace.
if (respCode> = 400) {System.out.println (url + "es un enlace roto");}demás{System.out.println (url + "es un enlace válido");}
Por lo tanto, podemos obtener todos los enlaces de la página web e imprimir si los enlaces son válidos o rotos.
Espero que este tutorial te ayude a verificar los enlaces rotos usando selenio.
Cómo obtener TODOS los enlaces de una página web
Uno de los procedimientos comunes en las pruebas web es probar si todos los enlaces presentes dentro de la página están funcionando. Esto se puede hacer convenientemente usando una combinación del método Java for-each loop , findElements () & By.tagName ("a") .
El método findElements (), devuelve una lista de elementos web con la etiqueta a. Usando un bucle for-each, se accede a cada elemento.
El siguiente código de WebDriver verifica cada enlace de la página de inicio de Mercury Tours para determinar los que están funcionando y los que todavía están en construcción.
import org.openqa.selenium.By;importar org.openqa.selenium.WebDriver;importar org.openqa.selenium.chrome.ChromeDriver;import java.util.List;import java.util.concurrent.TimeUnit;importar org.openqa.selenium. *;clase pública P1 {public static void main (String [] args) {String baseUrl = "http://demo.guru99.com/test/newtours/";System.setProperty ("webdriver.chrome.driver", "G: \\ chromedriver.exe");Controlador WebDriver = nuevo ChromeDriver ();String underConsTitle = "En construcción: Mercury Tours";driver.manage (). timeouts (). implicitlyWait (5, TimeUnit.SECONDS);driver.get (baseUrl);ListlinkElements = driver.findElements (By.tagName ("a"));Cadena [] linkTexts = nueva Cadena [linkElements.size ()];int i = 0;// extraer los textos del enlace de cada elemento del enlacepara (WebElement e: linkElements) {linkTexts [i] = e.getText ();i ++;}// prueba cada enlacepara (String t: linkTexts) {driver.findElement (By.linkText (t)). click ();if (driver.getTitle (). equals (underConsTitle)) {System.out.println ("\" "+ t +" \ ""+ "está en construcción.");} demás {System.out.println ("\" "+ t +" \ ""+ "está funcionando");}driver.navigate (). back ();}driver.quit ();}}
La salida debe ser similar a la que se indica a continuación.
Solución de problemas
En un caso aislado, el primer enlace al que se accede mediante el código podría ser el enlace "Inicio". En tal caso, la acción driver.navigate.back () mostrará una página en blanco ya que la primera acción es abrir un navegador. El controlador no podrá encontrar todos los demás enlaces en un navegador en blanco. Entonces, IDE lanzará una excepción y el resto del código no se ejecutará. Esto se puede manejar fácilmente usando un bucle If.