Jak znaleźć uszkodzone linki w Selenium
⚡ Inteligentne podsumowanie
Znajdowanie uszkodzonych linków w Selenium WebDriver polega na zebraniu każdego znacznika kotwicy i wysłaniu do każdego z nich żądania HTTP HEAD URLi odczytanie kodu odpowiedzi. Linki zwracające kod 400 lub wyższy są oznaczane jako uszkodzone, natomiast prawidłowe linki zwracają kody 2xx.

Co to są zepsute linki?
Zerwane linki to linki lub URLDo których nie można dotrzeć. Mogą być niedostępne lub nie działać z powodu błędu serwera.
A URL Zawsze będzie miał status 2xx, który jest prawidłowy. Istnieją różne kody statusu HTTP, które mają różne przeznaczenie. W przypadku nieprawidłowego żądania status HTTP to 4xx i 5xx.
Klasa kodów stanu 4xx jest przeznaczona głównie do oznaczania błędów po stronie klienta, a klasa kodów stanu 5xx jest przeznaczona głównie do oznaczania błędów odpowiedzi serwera.
Najprawdopodobniej nie będziemy w stanie potwierdzić, czy ten link działa, dopóki go nie klikniemy i nie potwierdzimy.
Dlaczego warto sprawdzić Uszkodzone linki?
Zawsze należy upewnić się, że na stronie nie ma żadnych uszkodzonych linków, gdyż w przeciwnym razie użytkownik nie powinien trafić na stronę z informacją o błędzie.
Błąd występuje, jeśli reguły nie zostały poprawnie zaktualizowane lub żądane zasoby nie istnieją na serwerze.
Ręczne sprawdzanie linków jest zadaniem żmudnym, ponieważ każda strona internetowa może zawierać dużą liczbę linków i ręczny proces trzeba powtarzać dla wszystkich stron.
Skrypt automatyzacji wykorzystujący Selenium które zautomatyzuje proces, jest bardziej trafnym rozwiązaniem.
Jak sprawdzić uszkodzone linki i obrazy w Selenium
Aby sprawdzić uszkodzone linki, należy wykonać następujące czynności.
- Zbierz wszystkie linki na stronie internetowej na podstawie tagu.
- Wyślij żądanie HTTP dotyczące łącza i odczytaj kod odpowiedzi HTTP.
- Na podstawie kodu odpowiedzi HTTP sprawdź, czy link jest prawidłowy czy uszkodzony.
- Powtórz tę czynność dla wszystkich przechwyconych łączy.
Code Jak znaleźć uszkodzone linki na stronie internetowej
Poniżej znajduje się kod sterownika sieciowego, który testuje nasz przypadek użycia:
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(); } }
Wyjaśnienie kodu uszkodzonych linków
Krok 1: Importuj pakiety
Oprócz pakietów domyślnych zaimportuj poniższy pakiet:
import java.net.HttpURLConnection;
Korzystając z metod zawartych w tym pakiecie, możemy wysyłać żądania HTTP i przechwytywać z odpowiedzi kody odpowiedzi HTTP.
Krok 2: Zbierz wszystkie linki na stronie internetowej
Zidentyfikuj wszystkie linki na stronie internetowej i zapisz je na liście.
List<WebElement> links = driver.findElements(By.tagName("a"));
Uzyskaj iterator do przeglądania listy.
Iterator<WebElement> it = links.iterator();
Krok 3: Identyfikacja i weryfikacja URL
W tej części sprawdzimy, czy URL należy do domeny osoby trzeciej lub czy URL jest pusty/null.
Pobierz atrybut href znacznika kotwicy i zapisz go w zmiennej url.
url = it.next().getAttribute("href");
Sprawdź, czy URL jest nullem lub pusty i pomija pozostałe kroki, jeśli warunek jest spełniony.
if(url == null || url.isEmpty()){ System.out.println("URL is either not configured for anchor tag or it is empty"); continue; }
Sprawdź, czy plik URL Należy do domeny głównej lub domeny zewnętrznej. Pomiń pozostałe kroki, jeśli należy do domeny zewnętrznej.
if(!url.startsWith(homePage)){ System.out.println("URL belongs to another domain, skipping it."); continue; }
Krok 4: Wyślij żądanie HTTP
HTTPURLKlasa Connection ma metody wysyłania żądania HTTP i przechwytywania kodu odpowiedzi HTTP. Zatem wynik metody openConnection() (URLPołączenie) jest rzutowane na typ HttpURLPołączenie.
huc = (HttpURLConnection)(new URL(url).openConnection());
Zamiast „GET” możemy ustawić typ żądania na „HEAD”, dzięki czemu zwracane będą tylko nagłówki, a nie treść dokumentu.
huc.setRequestMethod("HEAD");
Po wywołaniu metody connect() zostaje nawiązane faktyczne połączenie z adresem URL i wysłane żądanie.
huc.connect();
Krok 5: Sprawdzanie linków
Korzystanie z getResponseCode() możemy uzyskać kod odpowiedzi na żądanie.
respCode = huc.getResponseCode();
Na podstawie kodu odpowiedzi spróbujemy sprawdzić status łącza.
if(respCode >= 400){ System.out.println(url+" is a broken link"); } else{ System.out.println(url+" is a valid link"); }
Dzięki temu możemy uzyskać wszystkie linki ze strony internetowej i sprawdzić, czy są one prawidłowe, czy uszkodzone.
Jak zdobyć WSZYSTKIE linki do strony internetowej
Jedna z typowych procedur w pliku web Testy polega na sprawdzeniu, czy wszystkie linki znajdujące się na stronie działają. Można to wygodnie zrobić za pomocą kombinacji Java dla każdej pętli, findElements() & By.tagName(“a”) Metoda.
Metoda findElements() zwraca listę elementów internetowych oznaczonych znacznikiem a. Za pomocą pętli for-each uzyskuje się dostęp do każdego elementu.
Poniższy kod WebDriver sprawdza każde łącze z pliku Mercury Wycieczki po stronie głównej w celu określenia tych, które działają i tych, które są jeszcze w budowie.
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(); } }
Dane wyjściowe powinny być podobne do wskazanych poniżej.
- Dostęp do linków do obrazów odbywa się za pomocą metod By.cssSelector() i By.xpath().
Rozwiązywanie problemów
W odosobnionym przypadku pierwszym linkiem, do którego kod uzyskuje dostęp, może być link „Home”. W takim przypadku akcja driver.navigate.back() wyświetli pustą stronę, ponieważ pierwszą akcją jest otwarcie przeglądarki. Sterownik nie będzie w stanie znaleźć wszystkich innych linków w pustej przeglądarce. W takim przypadku środowisko IDE zgłosi wyjątek, a reszta kodu nie zostanie wykonana. Można to łatwo obsłużyć za pomocą pętli if.


.png)