Jak najít nefunkční odkazy v Selenium
⚡ Chytré shrnutí
Hledání nefunkčních odkazů v Selenium WebDriver zahrnuje shromažďování všech kotevních tagů a odeslání HTTP HEAD požadavku každému z nich. URLa čtení kódu odpovědi. Odkazy vracející kód 400 nebo vyšší jsou označeny jako nefunkční, zatímco platné odkazy vracejí kódy 2xx.

Co jsou nefunkční odkazy?
Nefunkční odkazy jsou odkazy nebo URLkteré nejsou dosažitelné. Mohou být mimo provoz nebo nefungovat kvůli chybě serveru.
A URL bude mít vždy status 2xx, což je platné. Existují různé stavové kódy HTTP, které mají různé účely. Pro neplatný požadavek je stav HTTP 4xx a 5xx.
Třída stavových kódů 4xx je určena hlavně pro chyby na straně klienta a třída stavových kódů 5xx je určena hlavně pro chyby odpovědi serveru.
S největší pravděpodobností nebudeme moci potvrdit, zda tento odkaz funguje nebo ne, dokud na něj neklikneme a nepotvrdíme.
Proč byste měli zkontrolovat Nefunkční odkazy?
Vždy byste se měli ujistit, že na webu nejsou žádné nefunkční odkazy, protože uživatel by se neměl dostat na chybovou stránku.
K chybě dojde, pokud pravidla nejsou správně aktualizována nebo požadované prostředky na serveru neexistují.
Ruční kontrola odkazů je zdlouhavý úkol, protože každá webová stránka může mít velké množství odkazů a ruční proces se musí opakovat pro všechny stránky.
Automatizační skript používající Selenium který proces zautomatizuje, je vhodnější řešení.
Jak zkontrolovat nefunkční odkazy a obrázky Selenium
Chcete-li zkontrolovat nefunkční odkazy, budete muset provést následující kroky.
- Shromážděte všechny odkazy na webové stránce na základě tagu.
- Odešlete HTTP požadavek na odkaz a přečtěte si kód odpovědi HTTP.
- Zjistěte, zda je odkaz platný nebo nefunkční, na základě kódu odpovědi HTTP.
- Tento postup opakujte pro všechny zachycené odkazy.
Code najít nefunkční odkazy na webové stránce
Níže je kód webového ovladače, který testuje náš případ použití:
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(); } }
Vysvětlení kódu Broken Links
Krok 1: Importujte balíčky
Kromě výchozích balíčků importujte i níže uvedený balíček:
import java.net.HttpURLConnection;
Pomocí metod v tomto balíčku můžeme odesílat požadavky HTTP a zachytit kódy odpovědí HTTP z odpovědi.
Krok 2: Shromážděte všechny odkazy na webové stránce
Identifikujte všechny odkazy na webové stránce a uložte je do seznamu.
List<WebElement> links = driver.findElements(By.tagName("a"));
Získejte iterátor pro procházení seznamu.
Iterator<WebElement> it = links.iterator();
Krok 3: Identifikace a validace URL
V této části ověříme, zda a URL patří k doméně třetí strany, nebo zda URL je prázdné/nulové.
Získejte href tagu kotvy a uložte ho do proměnné url.
url = it.next().getAttribute("href");
Zkontrolujte, zda URL je null nebo prázdný a pokud je podmínka splněna, zbývající kroky se přeskočí.
if(url == null || url.isEmpty()){ System.out.println("URL is either not configured for anchor tag or it is empty"); continue; }
Zkontrolujte, zda URL patří k hlavní doméně nebo k doméně třetí strany. Pokud patří k doméně třetí strany, zbývající kroky přeskočte.
if(!url.startsWith(homePage)){ System.out.println("URL belongs to another domain, skipping it."); continue; }
Krok 4: Odeslání HTTP požadavku
HTTPURLTřída Connection má metody pro odeslání HTTP požadavku a zachycení kódu HTTP odpovědi. Výstup metody openConnection() (URLConnection) je typově přetypováno na HttpURLSpojení.
huc = (HttpURLConnection)(new URL(url).openConnection());
Typ požadavku můžeme nastavit na „HEAD“ místo „GET“, takže se budou vracet pouze záhlaví a nikoli tělo dokumentu.
huc.setRequestMethod("HEAD");
Po volání metody connect() se naváže skutečné připojení k URL a odešle se požadavek.
huc.connect();
Krok 5: Ověření odkazů
Použití metody getResponseCode() můžeme získat kód odpovědi na požadavek.
respCode = huc.getResponseCode();
Na základě kódu odpovědi se pokusíme zkontrolovat stav odkazu.
if(respCode >= 400){ System.out.println(url+" is a broken link"); } else{ System.out.println(url+" is a valid link"); }
Můžeme tedy získat všechny odkazy z webové stránky a vypsat, zda jsou odkazy platné nebo nefunkční.
Jak získat VŠECHNY odkazy z webové stránky
Jeden z běžných postupů na webu Testování je otestovat, zda všechny odkazy na stránce fungují. To lze pohodlně provést pomocí kombinace Java pro každou smyčku, findElements() & By.tagName(“a”) metoda.
Metoda findElements() vrací seznam webových elementů s tagem a. Ke každému elementu se přistupuje pomocí cyklu for-each.
Níže uvedený kód WebDriver kontroluje každý odkaz z Mercury Prohlédněte si domovskou stránku a zjistěte ty, které jsou funkční a ty, které jsou stále ve výstavbě.
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(); } }
Výstup by měl být podobný níže uvedenému.
- Přístup k odkazům na obrázky se provádí pomocí metod By.cssSelector() a By.xpath().
Řešení potíží
V ojedinělém případě může být prvním odkazem, na který kód narazí, odkaz „Domů“. V takovém případě akce driver.navigate.back() zobrazí prázdnou stránku, protože první akcí je otevření prohlížeče. Ovladač nebude schopen najít všechny ostatní odkazy v prázdném prohlížeči. IDE tedy vyvolá výjimku a zbytek kódu se nespustí. To lze snadno ošetřit pomocí smyčky If.


.png)