Jak najít nefunkční odkazy v Selenium
Co jsou nefunkční odkazy?
Nefunkční odkazy jsou odkazy nebo adresy URL, které nejsou dostupné. Mohou být mimo provoz nebo nefungují kvůli nějaké chybě serveru
Adresa URL bude mít vždy stav s 2xx, který je platný. Existují různé stavové kódy HTTP, které mají různé účely. V případě neplatného požadavku je stav HTTP 4xx a 5xx.
Třída stavového kódu 4xx je určena hlavně pro chybu na straně klienta a třída stavových kódů 5xx je určena hlavně pro chybu odezvy 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 únavný úkol, protože každá webová stránka může obsahovat velké množství odkazů a ruční proces je nutné opakovat pro všechny stránky.
Automatizační skript pomocí 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ě značky.
- Odešlete požadavek HTTP 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.
Kód pro nalezení nefunkčních odkazů 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
Importujte níže uvedený balíček kromě výchozích balíčků:
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 Iterator k procházení seznamu.
Iterator<WebElement> it = links.iterator();
Krok 3: Identifikace a ověření adresy URL
V této části zkontrolujeme, zda URL patří do domény třetí strany nebo zda je URL prázdná/null.
Získejte href značky kotvy a uložte ji do proměnné url.
url = it.next().getAttribute("href");
Zkontrolujte, zda je adresa URL null nebo prázdná, a pokud je podmínka splněna, zbývající kroky přeskočte.
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ří do hlavní domény nebo třetí strany. Pokud patří do domény 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: Odešlete požadavek http
Třída HttpURLConnection má metody pro odeslání požadavku HTTP a zachycení kódu odpovědi HTTP. Takže výstup metody openConnection() (URLConnection) je přetypován na HttpURLConnection.
huc = (HttpURLConnection)(new URL(url).openConnection());
Můžeme nastavit typ požadavku jako „HEAD“ místo „GET“. Vracejí se tedy pouze hlavičky a ne tělo dokumentu.
huc.setRequestMethod("HEAD");
Při vyvolání metody connect() se vytvoří skutečné připojení k adrese URL a odešle se požadavek.
huc.connect();
Krok 5: Ověření odkazů
Pomocí 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 tak získat všechny odkazy z webové stránky a vytisknout, zda jsou odkazy platné nebo nefunkční.
Doufám, že vám tento tutoriál pomůže při kontrole nefunkčních odkazů pomocí selenu.
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 prvků se značkou a. Pomocí smyčky for-each je přístup ke každému prvku.
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 = "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(); } }
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, ke kterému kód přistupuje, 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 zvládnout pomocí smyčky If.