Hvordan finne ødelagte koblinger i Selenium
Hva er ødelagte koblinger?
Ødelagte lenker er lenker eller URL-er som ikke er tilgjengelige. De kan være nede eller ikke fungere på grunn av serverfeil
En URL vil alltid ha en status med 2xx som er gyldig. Det er forskjellige HTTP-statuskoder som har forskjellige formål. For en ugyldig forespørsel er HTTP-status 4xx og 5xx.
4xx-klassen med statuskode er hovedsakelig for klientsidefeil, og 5xx-klassen med statuskoder er hovedsakelig for serverresponsfeilen.
Vi vil mest sannsynlig ikke kunne bekrefte om den lenken fungerer eller ikke før vi klikker og bekrefter den.
Hvorfor bør du sjekke ødelagte lenker?
Du bør alltid sørge for at det ikke er ødelagte lenker på siden fordi brukeren ikke skal lande på en feilside.
Feilen oppstår hvis reglene ikke oppdateres riktig, eller de forespurte ressursene ikke eksisterer på serveren.
Manuell kontroll av lenker er en kjedelig oppgave, fordi hver nettside kan ha et stort antall lenker og manuell prosess må gjentas for alle sider.
Et automatiseringsskript som bruker Selenium som vil automatisere prosessen er en mer passende løsning.
Slik sjekker du de ødelagte koblingene og bildene Selenium
For å sjekke de ødelagte koblingene, må du gjøre følgende trinn.
- Samle alle koblingene på nettsiden basert på tag.
- Send HTTP-forespørsel for koblingen og les HTTP-svarkoden.
- Finn ut om koblingen er gyldig eller ødelagt basert på HTTP-svarkode.
- Gjenta dette for alle lenkene som er tatt.
Kode for å finne de ødelagte koblingene på en nettside
Nedenfor er nettdriverkoden som tester vår brukssituasjon:
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(); } }
Forklarer koden til Broken Links
Trinn 1: Importer pakker
Importer under pakken i tillegg til standardpakker:
import java.net.HttpURLConnection;
Ved å bruke metodene i denne pakken kan vi sende HTTP-forespørsler og fange opp HTTP-svarkoder fra svaret.
Trinn 2: Samle alle lenker på nettsiden
Identifiser alle lenker på en nettside og lagre dem i Liste.
List<WebElement> links = driver.findElements(By.tagName("a"));
Skaff Iterator for å gå gjennom listen.
Iterator<WebElement> it = links.iterator();
Trinn 3: Identifisere og validere URL
I denne delen vil vi sjekke om URL tilhører tredjeparts domene eller om URL er tom/null.
Få href av ankertaggen og lagre den i url-variabelen.
url = it.next().getAttribute("href");
Sjekk om URL er null eller Tom, og hopp over de resterende trinnene hvis betingelsen er oppfylt.
if(url == null || url.isEmpty()){ System.out.println("URL is either not configured for anchor tag or it is empty"); continue; }
Sjekk om URL tilhører et hoveddomene eller en tredjepart. Hopp over de gjenværende trinnene hvis det tilhører tredjeparts domene.
if(!url.startsWith(homePage)){ System.out.println("URL belongs to another domain, skipping it."); continue; }
Trinn 4: Send http-forespørsel
HttpURLConnection-klassen har metoder for å sende HTTP-forespørsel og fange opp HTTP-svarkode. Så utdata fra openConnection()-metoden (URLConnection) er typecastet til HttpURLConnection.
huc = (HttpURLConnection)(new URL(url).openConnection());
Vi kan angi forespørselstype som "HEAD" i stedet for "GET". Slik at kun overskrifter returneres og ikke dokumenttekst.
huc.setRequestMethod("HEAD");
Ved påkalling av connect()-metoden, opprettes den faktiske tilkoblingen til url og forespørselen sendes.
huc.connect();
Trinn 5: Validering av koblinger
Ved å bruke getResponseCode()-metoden kan vi få svarkode for forespørselen
respCode = huc.getResponseCode();
Basert på svarkoden vil vi prøve å sjekke lenkestatus.
if(respCode >= 400){ System.out.println(url+" is a broken link"); } else{ System.out.println(url+" is a valid link"); }
Dermed kan vi hente alle lenker fra nettsiden og skrive ut om lenker er gyldige eller ødelagte.
Håper denne opplæringen hjelper deg med å sjekke ødelagte koblinger ved bruk av selen.
Hvordan få ALLE koblinger til en nettside
En av de vanlige prosedyrene i web Testing er å teste om alle lenkene på siden fungerer. Dette kan enkelt gjøres ved å bruke en kombinasjon av Java for hver løkke, findElements() & By.tagName(“a”) metoden.
FindElements()-metoden returnerer en liste over webelementer med taggen a. Ved å bruke en for hver sløyfe får du tilgang til hvert element.
WebDriver-koden nedenfor kontrollerer hver lenke fra Mercury Tours hjemmeside for å finne de som fungerer og de som fortsatt er under konstruksjon.
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 = "http://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(); } }
Utgangen skal være lik den som er angitt nedenfor.
- Tilgang til bildelenker gjøres ved å bruke By.cssSelector()- og By.xpath()-metodene.
Feilsøking
I et isolert tilfelle kan den første lenken som koden får tilgang til være "Hjem"-koblingen. I slike tilfeller vil driver.navigate.back()-handlingen vise en tom side ettersom den første handlingen åpner en nettleser. Driveren vil ikke kunne finne alle andre lenker i en tom nettleser. Så IDE vil gi et unntak og resten av koden vil ikke kjøre. Dette kan enkelt håndteres ved hjelp av en If-løkke.