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.

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.
- Verzamel alle links op de webpagina op basis van de tag.
- Verstuur een HTTP-verzoek voor de link en lees de HTTP-responsstatuscode.
- Controleer aan de hand van de HTTP-responsstatuscode of de link geldig of defect is.
- 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.
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().
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.


.png)