Wat zijn verbroken links?
Gebroken links zijn links of URL's die niet bereikbaar zijn. Ze zijn mogelijk niet beschikbaar of werken niet vanwege een serverfout
Een URL heeft altijd een status met 2xx die geldig is. Er zijn verschillende HTTP-statuscodes die verschillende doeleinden hebben. Voor een ongeldig verzoek is de HTTP-status 4xx en 5xx.
De 4xx-klasse van statuscodes is voornamelijk bedoeld voor fouten aan de clientzijde en de 5xx-klasse van statuscodes is voornamelijk voor de serverresponsfout.
We zullen hoogstwaarschijnlijk niet kunnen bevestigen of die link werkt of niet totdat we erop klikken en deze bevestigen.
Waarom zou u Broken links controleren?
U moet er altijd voor zorgen dat er geen verbroken links op de site staan, omdat de gebruiker niet op een foutpagina terecht mag komen.
De fout treedt op als de regels niet correct zijn bijgewerkt, of de gevraagde bronnen niet aanwezig zijn op de server.
Het handmatig controleren van links is een vervelende taak, omdat elke webpagina een groot aantal links kan hebben en het handmatige proces voor alle pagina's moet worden herhaald.
Een automatiseringsscript met Selenium dat het proces zal automatiseren, is een geschiktere oplossing.
Hoe u de verbroken links en afbeeldingen kunt controleren
Om de verbroken links te controleren, moet u de volgende stappen uitvoeren.
- Verzamel alle links op de webpagina op basis van de -tag.
- Stuur een HTTP-verzoek voor de link en lees de HTTP-antwoordcode.
- Zoek uit of de link geldig of verbroken is op basis van de HTTP-antwoordcode.
- Herhaal dit voor alle vastgelegde links.
Code om de verbroken links op een webpagina te vinden
Hieronder vindt u de webstuurprogrammacode die onze use-case test:
pakket automatiseringPraktijk;importeer java.io.IOException;importeer java.net.HttpURLConnection;importeer java.net.MalformedURLException;importeer java.net.URL;importeer java.util.Iterator;importeer java.util.List;import org.openqa.selenium.By;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.WebElement;importeer org.openqa.selenium.chrome.ChromeDriver;openbare klas BrokenLinks {privé statische WebDriver-driver = null;public static void main (String [] args) {// TODO Automatisch gegenereerde methodestubString homePage = "http://www.zlti.com";String url = "";HttpURLConnection huc = null;int respCode = 200;driver = nieuwe ChromeDriver ();driver.manage (). window (). maximaliseren ();driver.get (startpagina);Lijstlinks = driver.findElements (By.tagName ("a"));Iterator 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 niet geconfigureerd voor ankertag of is leeg");doorgaan met;if (! url.startsWith (homePage)) {System.out.println ("URL behoort tot een ander domein, slaat het over.");doorgaan met;proberen {huc = (HttpURLConnection) (nieuwe URL (url) .openConnection ());huc.setRequestMethod ("HEAD");huc.connect ();respCode = huc.getResponseCode ();if (respCode> = 400) {System.out.println (url + "is een verbroken link");anders{System.out.println (url + "is een geldige link");} catch (MalformedURLException e) {// TODO Automatisch gegenereerd catch-bloke.printStackTrace ();} catch (IOException e) {// TODO Automatisch gegenereerd catch-bloke.printStackTrace ();driver.quit ();
Uitleg van de code Voorbeeld
Stap 1: Pakketten importeren
Importeer onderstaand pakket naast de standaardpakketten:
importeer java.net.HttpURLConnection;
Met behulp van de methoden in dit pakket kunnen we HTTP-verzoeken verzenden en HTTP-responscodes van het antwoord opvangen.
Stap 2: Verzamel alle links op de webpagina
Identificeer alle links op een webpagina en sla ze op in Lijst.
Lijstlinks = driver.findElements (By.tagName ("a"));
Verkrijg Iterator om door de lijst te lopen.
Iteratorit = links.iterator ();
Stap 3: URL identificeren en valideren
In dit deel zullen we controleren of de URL tot het domein van een derde behoort of dat de URL leeg / null is.
Haal de href van de ankertag op en sla deze op in de url-variabele.
url = it.next (). getAttribute ("href");
Controleer of de URL null of leeg is en sla de resterende stappen over als aan de voorwaarde is voldaan.
if (url == null || url.isEmpty ()) {System.out.println ("URL is niet geconfigureerd voor ankertag of is leeg");doorgaan met;
Controleer of de URL bij een hoofddomein of bij een derde partij hoort. Sla de resterende stappen over als het tot een domein van derden behoort.
if (! url.startsWith (homePage)) {System.out.println ("URL behoort tot een ander domein, slaat het over.");doorgaan met;
Stap 4: stuur een http-verzoek
De klasse HttpURLConnection heeft methoden om HTTP-verzoeken te verzenden en HTTP-antwoordcode vast te leggen. De uitvoer van de methode openConnection () (URLConnection) wordt dus gecast naar HttpURLConnection.
huc = (HttpURLConnection) (nieuwe URL (url) .openConnection ());
We kunnen het verzoektype instellen als "HEAD" in plaats van "GET". Zodat alleen headers worden geretourneerd en niet de hoofdtekst van het document.
huc.setRequestMethod ("HEAD");
Bij het aanroepen van de methode connect () wordt de daadwerkelijke verbinding met de URL tot stand gebracht en wordt het verzoek verzonden.
huc.connect ();
Stap 5: Links valideren
Met behulp van de methode getResponseCode () kunnen we responscode voor het verzoek krijgen
respCode = huc.getResponseCode ();
Op basis van de responscode zullen we proberen de linkstatus te controleren.
if (respCode> = 400) {System.out.println (url + "is een verbroken link");anders{System.out.println (url + "is een geldige link");
Zo kunnen we alle links van een webpagina ophalen en afdrukken of links geldig of verbroken zijn.
Ik hoop dat deze tutorial je helpt bij het controleren van gebroken links met selenium.
Hoe u ALLE links van een webpagina kunt krijgen
Een van de gebruikelijke procedures bij webtesten is om te testen of alle links op de pagina werken. Dit kan gemakkelijk worden gedaan met behulp van een combinatie van de Java for-each-lus , findElements () & By.tagName ("a") - methode.
De methode findElements () retourneert een lijst met webelementen met tag a. Met behulp van een for-each-lus wordt elk element benaderd.
De onderstaande WebDriver-code controleert elke link op de startpagina van Mercury Tours om te bepalen welke werken en welke nog in aanbouw zijn.
import org.openqa.selenium.By;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.chrome.ChromeDriver;importeer java.util.List;importeer java.util.concurrent.TimeUnit;importeer org.openqa.selenium. *;openbare klasse P1 {public static void main (String [] args) {String baseUrl = "http://demo.guru99.com/test/newtours/";System.setProperty ("webdriver.chrome.driver", "G: \\ chromedriver.exe");WebDriver-stuurprogramma = nieuwe ChromeDriver ();String underConsTitle = "In aanbouw: Mercury Tours";driver.manage (). timeouts (). implicitlyWait (5, TimeUnit.SECONDS);driver.get (baseUrl);LijstlinkElements = driver.findElements (By.tagName ("a"));String [] linkTexts = nieuwe String [linkElements.size ()];int i = 0;// extraheer de linkteksten van elk linkelementvoor (WebElement e: linkElements) {linkTexts [i] = e.getText ();i ++;// test elke linkvoor (String t: linkTexts) {driver.findElement (By.linkText (t)). klik ();if (driver.getTitle (). equals (underConsTitle)) {System.out.println ("\" "+ t +" \ ""+ "is in aanbouw.");} anders {System.out.println ("\" "+ t +" \ ""+ "werkt.");driver.navigate (). terug ();driver.quit ();
De output moet vergelijkbaar zijn met die hieronder aangegeven.
Probleemoplossen
In een op zichzelf staand geval zou de eerste link waartoe de code toegang heeft, de "Home" -link kunnen zijn. In dat geval zal de actie driver.navigate.back () een lege pagina tonen als de eerste actie het openen van een browser is. De bestuurder kan niet alle andere links vinden in een lege browser. Dus IDE genereert een uitzondering en de rest van de code wordt niet uitgevoerd. Dit kan eenvoudig worden afgehandeld met een If-lus.