Hoe u gebroken links kunt vinden Selenium

โšก Slimme samenvatting

Het vinden van defecte links in Selenium WebDriver verzamelt alle anchor-tags en stuurt naar elk daarvan een HTTP HEAD-verzoek. URLen het uitlezen van de responscode. Links die een 400-code of hoger retourneren, worden als defect gemarkeerd, terwijl geldige links een 2xx-code retourneren.

  • ๐Ÿ”— Definitie: Een kapotte link is een URL die niet bereikbaar is en meestal een 4xx- of 5xx-foutmelding geeft.
  • ๐Ÿงญ Waarom het uitmaakt: Kapotte links schaden de gebruikerservaring en SEO, daarom vervangen geautomatiseerde controles de trage handmatige verificatie.
  • ๐Ÿ“ฅ Verzamel links: Gebruik findElements met By.tagName(โ€œaโ€) om alle anker-elementen op de pagina in een lijst te verzamelen.
  • ๐Ÿ“ก HEAD-verzoek verzenden: Open een HTTP-adresURLMaak verbinding, stel de methode in op HEAD en lees de responscode per URL.
  • โœ… Status valideren: Beschouw een responsstatuscode van 400 of hoger als een defecte verbinding en elke 2xx-code als een werkende verbinding.

Hoe u gebroken links kunt vinden Selenium

Wat zijn gebroken links?

Kapotte links zijn links of URLs die niet bereikbaar zijn. Ze zijn mogelijk offline of functioneren niet vanwege een serverfout.

A URL Een verzoek heeft altijd een statuscode 2xx, wat geldig is. Er zijn verschillende HTTP-statuscodes met verschillende functies. Voor een ongeldig verzoek is de HTTP-status 4xx of 5xx.

De statuscodes uit de 4xx-klasse worden voornamelijk gebruikt voor fouten aan de clientzijde, terwijl de statuscodes uit de 5xx-klasse voornamelijk worden gebruikt voor fouten in de serverrespons.

We kunnen hoogstwaarschijnlijk niet bevestigen of de link werkt of niet totdat we erop klikken en deze bevestigen.

Waarom zou u Gebroken links controleren?

Je moet er altijd voor zorgen dat er geen kapotte links op de site staan, want de gebruiker mag niet op een foutpagina terechtkomen.

De fout treedt op als de regels niet correct zijn bijgewerkt of als de gevraagde bronnen niet op de server aanwezig zijn.

Het handmatig controleren van links is een tijdrovende klus, omdat elke webpagina een groot aantal links kan bevatten en het handmatige proces voor alle pagina's herhaald moet worden.

Een automatiseringsscript dat gebruikmaakt van Selenium dat het proces automatiseert, is een geschiktere oplossing.

Hoe u de verbroken links en afbeeldingen kunt controleren Selenium

Om te controleren of er sprake is van kapotte links, moet u de volgende stappen volgen.

  1. Verzamel alle links op de webpagina op basis van de tag.
  2. Verstuur een HTTP-verzoek voor de link en lees de HTTP-responsstatuscode.
  3. Controleer aan de hand van de HTTP-responsstatuscode of de link geldig of defect is.
  4. Herhaal dit voor alle vastgelegde links.

Code De defecte links op een webpagina vinden

Hieronder vindt u de webdrivercode die onze use case test:

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

    }
}

Uitleg van de code van Broken Links

Stap 1: Pakketten importeren

Importeer het onderstaande pakket naast de standaardpakketten:

import java.net.HttpURLConnection;

Met behulp van de methoden in dit pakket kunnen we HTTP-verzoeken verzenden en HTTP-antwoordcodes uit het antwoord vastleggen.

Stap 2: Verzamel alle links op de webpagina

Identificeer alle links op een webpagina en sla ze op in een lijst.

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

Verkrijg een iterator om door de lijst te lopen.

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

Stap 3: Identificeren en valideren URL

In dit deel controleren we of een URL behoort tot een domein van een derde partij of dat de URL is leeg/null.

Haal de href van de anchor-tag op en sla deze op in de variabele url.

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

Controleer of de URL is null of leeg en sla de resterende stappen over als aan de voorwaarde is voldaan.

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

Controleer of de URL behoort tot een hoofddomein of een domein van een derde partij. Sla de resterende stappen over als het tot een domein van een derde partij behoort.

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

Stap 4: HTTP-verzoek verzenden

De HTTPURLDe Connection-klasse heeft methoden om een โ€‹โ€‹HTTP-verzoek te verzenden en de HTTP-responsstatuscode vast te leggen. De uitvoer van de openConnection()-methode (URLDe verbinding wordt gecast naar HTTP.URLVerbinding.

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

We kunnen het verzoektype instellen op "HEAD" in plaats van "GET", zodat alleen de headers worden teruggestuurd en niet de documentinhoud.

huc.setRequestMethod("HEAD");

Bij het aanroepen van de connect()-methode wordt de daadwerkelijke verbinding met de URL tot stand gebracht en het verzoek verzonden.

huc.connect();

Stap 5: Koppelingen valideren

De getResponse gebruikenCodeMet de ()-methode kunnen we de responsstatuscode voor het verzoek verkrijgen.

respCode = huc.getResponseCode();

Aan de hand van de responscode proberen we de verbindingsstatus te controleren.

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

Zo kunnen we alle links van een webpagina ophalen en afdrukken of de links geldig of defect zijn.

Hoe u ALLE links van een webpagina kunt krijgen

Een van de gebruikelijke procedures in web Testen is om te testen of alle aanwezige links op de pagina werken. Dit kan gemakkelijk worden gedaan met behulp van een combinatie van de Java voor elke lus, vindElementen() & By.tagName(โ€œaโ€) methode.

De findElements()-methode retourneert een lijst met web-elementen met de tag a. Met behulp van een for-each-lus wordt elk element doorlopen.

Ontvang ALLE links van een webpagina

De onderstaande WebDriver-code controleert elke link van het Mercury Bezoek de startpagina om te bepalen welke werken en welke nog in aanbouw zijn.

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

De uitvoer moet vergelijkbaar zijn met de hieronder aangegeven uitvoer.

  • Toegang tot afbeeldingslinks gebeurt met behulp van de methoden By.cssSelector() en By.xpath().

Ontvang ALLE links van een webpagina

Probleemoplossen

In een geรฏsoleerd geval kan de eerste link die door de code wordt aangeroepen de "Home"-link zijn. In zo'n geval zal de actie `driver.navigate.back()` een lege pagina weergeven, omdat de eerste actie het openen van een browser is. De driver kan niet alle andere links vinden in een lege browser. De IDE zal daarom een โ€‹โ€‹uitzondering genereren en de rest van de code zal niet worden uitgevoerd. Dit kan eenvoudig worden opgelost met een `if`-lus.

Veelgestelde vragen

Selenium verzamelt alle anchor-tags en stuurt een HTTP HEAD-verzoek naar elk ervan. URLen markeert elke link die een foutcode 400 of hoger retourneert als defect.

Een 4xx-code duidt op een probleem aan de clientzijde, zoals een ontbrekende pagina, terwijl een 5xx-code wijst op een fout aan de serverzijde tijdens de verwerking van het verzoek.

Ja. Afbeeldingsbronnen worden verzameld met By.cssSelector() of By.xpath(), en vervolgens wordt elke src URL wordt gevalideerd aan de hand van de HTTP-responsstatuscode.

Ja. Op AI gebaseerde crawlers scannen pagina's, volgen links en signaleren defecte of doorverwijzende links. URLzonder handmatige scripting.

AI monitort de status van verbindingen in de loop van de tijd, voorspelt storingen en stelt vervangingen voor, waardoor herhaalde handmatige controles van verbindingen worden verminderd.

Vat dit bericht samen met: