Comment trouver des liens brisés dans Selenium
⚡ Résumé intelligent
Trouver des liens brisés dans Selenium WebDriver implique la collecte de chaque balise d'ancrage, l'envoi d'une requête HTTP HEAD à chaque URLet en lisant le code de réponse. Les liens renvoyant un code 400 ou supérieur sont signalés comme rompus, tandis que les liens valides renvoient des codes 2xx.

Que sont les liens brisés ?
Les liens brisés sont des liens ou URLCes services sont inaccessibles. Ils peuvent être hors service ou ne pas fonctionner en raison d'une erreur de serveur.
A URL Le statut HTTP sera toujours 2xx, ce qui indique une requête valide. Il existe différents codes de statut HTTP, chacun ayant sa propre fonction. Pour une requête invalide, le statut HTTP est 4xx ou 5xx.
Les codes d'état de la classe 4xx concernent principalement les erreurs côté client, tandis que ceux de la classe 5xx concernent principalement les erreurs 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.
- Récupérez tous les liens de la page web en fonction de l' étiquette.
- Envoyez une requête HTTP pour le lien et lisez le code de réponse HTTP.
- Déterminez si le lien est valide ou non en fonction du code de réponse HTTP.
- Répétez cette opération pour tous les liens capturés.
Code 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 une liste.
List<WebElement> links = driver.findElements(By.tagName("a"));
Obtenez un itérateur pour parcourir la liste.
Iterator<WebElement> it = links.iterator();
Étape 3 : Identification et validation URL
Dans cette partie, nous vérifierons si un URL appartient à un domaine tiers ou si le URL est vide/nul.
Récupérez l'attribut href de la balise d'ancrage et stockez-le dans la variable url.
url = it.next().getAttribute("href");
Vérifiez si le URL si la valeur est nulle ou vide, passez aux étapes suivantes si la condition est satisfaite.
if(url == null || url.isEmpty()){ System.out.println("URL is either not configured for anchor tag or it is empty"); continue; }
Vérifiez si le URL appartient à un domaine principal ou à un domaine tiers. Ignorez les étapes suivantes 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
Le HttpURLLa classe Connection 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 converti en HttpURLLien.
huc = (HttpURLConnection)(new URL(url).openConnection());
Nous pouvons définir le type de requête sur « HEAD » au lieu de « GET », afin que seuls les en-têtes soient renvoyés et non le corps du document.
huc.setRequestMethod("HEAD");
Lors de l'appel de la méthode connect(), la connexion réelle à l'URL est établie et la requête est envoyée.
huc.connect();
Étape 5 : validation des liens
Utilisation de getResponseCodeLa méthode () nous permet d'obtenir le code de réponse à la requête.
respCode = huc.getResponseCode();
En fonction du code de réponse, nous tenterons 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 d'une page web et indiquer si ces liens sont valides ou non.
Comment obtenir TOUS les liens d'une page Web
L'une des procédures courantes sur le Web Tests 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 ayant la balise a. Chaque élément est ensuite parcouru à l'aide d'une boucle for-each.
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 = "https://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().
Dépannage
Dans un cas isolé, le premier lien accédé par le code pourrait être le lien « Accueil ». Dans ce cas, l'action `driver.navigate.back()` affichera une page blanche, car la première action consiste à ouvrir un navigateur. Le pilote ne pourra pas trouver les autres liens dans un navigateur vide. Par conséquent, l'IDE générera une exception et le reste du code ne s'exécutera pas. Ce problème peut être facilement résolu à l'aide d'une boucle `if`.


.png)