Hur man hittar trasiga länkar i Selenium
⚡ Smart sammanfattning
Hitta trasiga länkar i Selenium WebDriver involverar insamling av varje ankartagg, skickande av en HTTP HEAD-förfrågan till varje URLoch läser svarskoden. Länkar som returnerar 400 eller högre flaggas som trasiga, medan giltiga länkar returnerar 2xx-koder.

Vad är trasiga länkar?
Trasiga länkar är länkar eller URLsom inte är nåbara. De kan vara nere eller inte fungera på grund av något serverfel.
A URL kommer alltid att ha statusen 2xx, vilket är giltigt. Det finns olika HTTP-statuskoder som har olika syften. För en ogiltig begäran är HTTP-statusen 4xx och 5xx.
Statuskoden 4xx-klassen är huvudsakligen för klientsidesfel, och statuskoden 5xx-klassen är huvudsakligen för serversvarsfel.
Vi kommer sannolikt inte att kunna bekräfta om den länken fungerar eller inte förrän vi klickar och bekräftar den.
Varför ska du kolla Brutna länkar?
Du bör alltid se till att det inte finns några trasiga länkar på webbplatsen, eftersom användaren inte ska hamna på en felsida.
Felet uppstår om reglerna inte uppdateras korrekt, eller om de begärda resurserna inte finns på servern.
Manuell kontroll av länkar är en mödosam uppgift, eftersom varje webbsida kan ha ett stort antal länkar och den manuella processen måste upprepas för alla sidor.
Ett automatiseringsskript som använder Selenium som kommer att automatisera processen är en mer lämplig lösning.
Så här kontrollerar du brutna länkar och bilder Selenium
För att kontrollera de trasiga länkarna måste du göra följande steg.
- Samla alla länkar på webbsidan baserat på taggen.
- Skicka en HTTP-förfrågan för länken och läs HTTP-svarskoden.
- Ta reda på om länken är giltig eller trasig baserat på HTTP-svarskoden.
- Upprepa detta för alla länkar som tagits.
Code att hitta trasiga länkar på en webbsida
Nedan finns webbdrivrutinskoden som testar vårt användningsfall:
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(); } }
Förklara koden för brutna länkar
Steg 1: Importera paket
Importera följande paket utöver standardpaketen:
import java.net.HttpURLConnection;
Med metoderna i det här paketet kan vi skicka HTTP-förfrågningar och fånga HTTP-svarskoder från svaret.
Steg 2: Samla alla länkar på webbsidan
Identifiera alla länkar på en webbsida och lagra dem i en lista.
List<WebElement> links = driver.findElements(By.tagName("a"));
Skaffa en iterator för att gå igenom listan.
Iterator<WebElement> it = links.iterator();
Steg 3: Identifiera och validera URL
I den här delen ska vi kontrollera om en URL tillhör en tredjepartsdomän eller om den URL är tom/null.
Hämta href-filen från ankartaggen och lagra den i url-variabeln.
url = it.next().getAttribute("href");
Kontrollera om URL är null eller tom och hoppar över de återstående stegen om villkoret är uppfyllt.
if(url == null || url.isEmpty()){ System.out.println("URL is either not configured for anchor tag or it is empty"); continue; }
Kontrollera om URL tillhör en huvuddomän eller en tredje part. Hoppa över de återstående stegen om den tillhör en tredje parts domän.
if(!url.startsWith(homePage)){ System.out.println("URL belongs to another domain, skipping it."); continue; }
Steg 4: Skicka HTTP-förfrågan
Http-filenURLConnection-klassen har metoder för att skicka en HTTP-förfrågan och samla in HTTP-svarskoden. Så utdata från openConnection()-metoden (URLAnslutning) är typkonverterad till HttpURLFörbindelse.
huc = (HttpURLConnection)(new URL(url).openConnection());
Vi kan ställa in förfrågningstypen som "HEAD" istället för "GET", så att endast rubriker returneras och inte dokumentets brödtext.
huc.setRequestMethod("HEAD");
När metoden connect() anropas upprättas den faktiska anslutningen till URL:en och begäran skickas.
huc.connect();
Steg 5: Validera länkar
Använda getResponseCode()-metoden kan vi hämta svarskoden för begäran.
respCode = huc.getResponseCode();
Baserat på svarskoden kommer vi att försöka kontrollera länkens status.
if(respCode >= 400){ System.out.println(url+" is a broken link"); } else{ System.out.println(url+" is a valid link"); }
Således kan vi hämta alla länkar från en webbsida och skriva ut om länkarna är giltiga eller trasiga.
Hur man får ALLA länkar till en webbsida
En av de vanliga procedurerna i webben Testning är att testa om alla länkar som finns på sidan fungerar. Detta kan bekvämt göras med en kombination av Java för varje slinga, findElements() & By.tagName(”a”) metod.
Metoden findElements() returnerar en lista över webbelement med taggen a. Med hjälp av en for-each-loop nås varje element.
WebDriver-koden nedan kontrollerar varje länk från Mercury Tours hemsida för att avgöra vilka som fungerar och de som fortfarande är under uppbyggnad.
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(); } }
Utgången bör vara liknande den som anges nedan.
- Åtkomst till bildlänkar görs med metoderna By.cssSelector() och By.xpath().
Felsökning
I ett isolerat fall kan den första länken som koden öppnar vara länken "Hem". I ett sådant fall kommer åtgärden driver.navigate.back() att visa en tom sida, eftersom den första åtgärden är att öppna en webbläsare. Drivrutinen kommer inte att kunna hitta alla andra länkar i en tom webbläsare. Så IDE:n kommer att generera ett undantag och resten av koden kommer inte att köras. Detta kan enkelt hanteras med en If-loop.


.png)