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.

  • 🔗 Definicja: Zerwany link to URL do którego nie można dotrzeć, zwykle zwracający błąd 4xx lub 5xx.
  • 🧭 Dlaczego jest to ważne: Niedziałające linki szkodzą doświadczeniu użytkownika i SEO, dlatego powolną weryfikację ręczną zastępuje się automatycznymi kontrolami.
  • 📥 Zbierz linki: Użyj findElements z By.tagName(“a”), aby zebrać wszystkie elementy zakotwiczające na stronie w formie listy.
  • 📡 Wyślij żądanie HEAD: Otwórz HttpURLPołączenie, ustawienie metody na HEAD i odczytanie kodu odpowiedzi zgodnie z URL.
  • Sprawdź status: Kod odpowiedzi równy 400 lub wyższy traktuj jako łącze uszkodzone, a każdy kod 2xx jako łącze działające.

Jak znaleźć uszkodzone linki w Selenium

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.

  1. Zbierz wszystkie linki na stronie internetowej na podstawie tagu.
  2. Wyślij żądanie HTTP dotyczące łącza i odczytaj kod odpowiedzi HTTP.
  3. Na podstawie kodu odpowiedzi HTTP sprawdź, czy link jest prawidłowy czy uszkodzony.
  4. 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.

Pobierz WSZYSTKIE linki do strony internetowej

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().

Pobierz WSZYSTKIE linki do strony internetowej

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.

FAQ

Selenium zbiera wszystkie znaczniki kotwicowe, wysyła do każdego z nich żądanie HTTP HEAD URLi oznacza każdy link zwracający wartość 400 lub wyższą jako uszkodzony.

Kod 4xx oznacza problem po stronie klienta, na przykład brakującą stronę, natomiast kod 5xx oznacza błąd po stronie serwera, występujący podczas przetwarzania żądania.

Tak. Źródła obrazów są zbierane za pomocą By.cssSelector() lub By.xpath(), a następnie każde źródło URL jest weryfikowany poprzez kod odpowiedzi HTTP.

Tak. Roboty oparte na sztucznej inteligencji skanują strony, podążają za linkami i oznaczają uszkodzone lub przekierowujące elementy. URLbez konieczności ręcznego pisania skryptów.

Sztuczna inteligencja monitoruje stan łącza na przestrzeni czasu, przewiduje awarie i sugeruje wymianę, ograniczając konieczność powtarzania ręcznych audytów łącza.

Podsumuj ten post następująco: