Comment trouver des liens brisés dans Selenium

Que sont les liens brisés ?

Les liens brisés sont des liens ou des URL inaccessibles. Ils peuvent être en panne ou ne pas fonctionner en raison d'une erreur de serveur

Une URL aura toujours un statut avec 2xx qui est valide. Il existe différents codes d'état HTTP qui ont des objectifs différents. Pour une requête invalide, le statut HTTP est 4xx et 5xx.

La classe 4xx de code d'état est principalement destinée aux erreurs côté client, et la classe 5xx de codes d'état est principalement destinée à l'erreur de réponse du serveur.

Nous ne serons probablement pas en mesure de confirmer si ce lien fonctionne ou non tant que nous n'aurons pas cliqué dessus et confirmé.

Pourquoi devriez-vous vérifier les liens brisés ?

Vous devez toujours vous assurer qu’il n’y a pas de liens brisés sur le site, car l’utilisateur ne doit pas atterrir sur une page d’erreur.

L'erreur se produit si les règles ne sont pas mises à jour correctement ou si les ressources demandées n'existent pas sur le serveur.

La vérification manuelle des liens est une tâche fastidieuse, car chaque page Web peut contenir un grand nombre de liens et le processus manuel doit être répété pour toutes les pages.

Un script d'automatisation utilisant Selenium qui automatisera le processus est une solution plus appropriée.

Comment vérifier les liens brisés et les images dans Selenium

Pour vérifier les liens rompus, vous devrez suivre les étapes suivantes.

  1. Collectez tous les liens de la page Web en fonction de la balise.
  2. Envoyez une requête HTTP pour le lien et lisez le code de réponse HTTP.
  3. Découvrez si le lien est valide ou rompu en fonction du code de réponse HTTP.
  4. Répétez cette opération pour tous les liens capturés.

Code pour trouver les liens brisés sur une page Web

Vous trouverez ci-dessous le code du pilote Web qui teste notre cas d'utilisation :

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();

    }
}

Expliquer le code des liens brisés

Étape 1 : Importer des packages

Importez le package ci-dessous en plus des packages par défaut :

import java.net.HttpURLConnection;

En utilisant les méthodes de ce package, nous pouvons envoyer des requêtes HTTP et capturer les codes de réponse HTTP à partir de la réponse.

Étape 2 : Collectez tous les liens de la page Web

Identifiez tous les liens d’une page Web et stockez-les dans la liste.

List<WebElement> links = driver.findElements(By.tagName("a"));

Obtenez Iterator pour parcourir la liste.

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

Étape 3 : identification et validation de l'URL

Dans cette partie, nous vérifierons si l'URL appartient à un domaine tiers ou si l'URL est vide/nulle.

Obtenez le href de la balise d'ancrage et stockez-le dans la variable url.

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

Vérifiez si l'URL est nulle ou vide et ignorez les étapes restantes si la condition est remplie.

if(url == null || url.isEmpty()){
              System.out.println("URL is either not configured for anchor tag or it is empty");
              continue;
     }

Vérifiez si l'URL appartient à un domaine principal ou à un tiers. Ignorez les étapes restantes s'il appartient à un domaine tiers.

 if(!url.startsWith(homePage)){
           System.out.println("URL belongs to another domain, skipping it.");
           continue;
   }

Étape 4 : Envoyer une requête http

La classe HttpURLConnection possède des méthodes pour envoyer une requête HTTP et capturer le code de réponse HTTP. Ainsi, la sortie de la méthode openConnection() (URLConnection) est convertie en HttpURLConnection.

huc = (HttpURLConnection)(new URL(url).openConnection());

Nous pouvons définir le type de requête sur « HEAD » au lieu de « GET ». Ainsi, seuls les en-têtes sont renvoyés et non le corps du document.

huc.setRequestMethod("HEAD");

Lors de l’invocation de la méthode connect(), la connexion réelle à l’URL est établie et la demande est envoyée.

huc.connect();

Étape 5 : validation des liens

En utilisant la méthode getResponseCode(), nous pouvons obtenir le code de réponse pour la requête

respCode = huc.getResponseCode();

Sur la base du code de réponse, nous essaierons de vérifier l'état du lien.

if(respCode >= 400){
        System.out.println(url+" is a broken link");
}
else{
        System.out.println(url+" is a valid link");
}

Ainsi, nous pouvons obtenir tous les liens de la page Web et indiquer si les liens sont valides ou rompus.

J'espère que ce tutoriel vous aidera à vérifier les liens brisés à l'aide de sélénium.

Comment obtenir TOUS les liens d'une page Web

L'une des procédures courantes sur le Web Contrôle de qualité est de tester si tous les liens présents dans la page fonctionnent. Cela peut être facilement réalisé en utilisant une combinaison des Java pour chaque boucle, findElements() & Par.tagName("a") méthode.

La méthode findElements() renvoie une liste d'éléments Web avec la balise a. À l’aide d’une boucle for-each, chaque élément est accessible.

Obtenez TOUS les liens d'une page Web

Le code WebDriver ci-dessous vérifie chaque lien du Mercury Page d'accueil des visites pour déterminer celles qui fonctionnent et celles qui sont encore en construction.

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();			
    }		
}

Le résultat doit être similaire à celui indiqué ci-dessous.

  • L'accès aux liens d'images se fait à l'aide des méthodes By.cssSelector() et By.xpath().

Obtenez TOUS les liens d'une page Web

Dépannage

Dans un cas isolé, le premier lien auquel accède le code pourrait être le lien « Accueil ». Dans ce cas, l'action driver.navigate.back() affichera une page vierge car la première action ouvre un navigateur. Le pilote ne pourra pas trouver tous les autres liens dans un navigateur vierge. L'IDE lancera donc une exception et le reste du code ne s'exécutera pas. Cela peut être facilement géré à l’aide d’une boucle If.