Jak znaleźć uszkodzone linki w Selenium

Co to są zepsute linki?

Uszkodzone linki to linki lub adresy URL, do których nie można dotrzeć. Mogą nie działać lub nie działać z powodu błędu serwera

Adres URL zawsze będzie miał status 2xx, który jest prawidłowy. Istnieją różne kody stanu HTTP, które mają różne cele. W przypadku nieprawidłowego żądania stan HTTP to 4xx i 5xx.

Klasa kodów stanu 4xx dotyczy głównie błędów po stronie klienta, a klasa kodów stanu 5xx dotyczy głównie 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 powinieneś upewnić się, że w witrynie nie ma uszkodzonych linków, ponieważ użytkownik nie powinien trafić na stronę błędu.

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 żmudnym zadaniem, ponieważ każda strona internetowa może zawierać dużą liczbę linków, a proces ręczny należy powtórzyć 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 przeczytaj kod odpowiedzi HTTP.
  3. Dowiedz się, czy link jest ważny, czy uszkodzony, na podstawie kodu odpowiedzi HTTP.
  4. Powtórz tę czynność dla wszystkich przechwyconych łączy.

Kod do wyszukiwania uszkodzonych linków 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

Zaimportuj poniższy pakiet oprócz pakietów domyślnych:

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 przechowuj je na liście.

List<WebElement> links = driver.findElements(By.tagName("a"));

Uzyskaj Iterator, aby przeglądać listę.

Iterator<WebElement> it = links.iterator();

Krok 3: Identyfikacja i weryfikacja adresu URL

W tej części sprawdzimy, czy adres URL należy do domeny zewnętrznej lub czy adres URL jest pusty/null.

Pobierz href tagu kotwicy i zapisz go w zmiennej url.

url = it.next().getAttribute("href");

Sprawdź, czy adres URL ma wartość null lub jest pusty i pomiń 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 adres URL należy do domeny głównej czy strony trzeciej. Pomiń pozostałe kroki, jeśli należy ona do domeny strony trzeciej.

 if(!url.startsWith(homePage)){
           System.out.println("URL belongs to another domain, skipping it.");
           continue;
   }

Krok 4: Wyślij żądanie http

Klasa HttpURLConnection zawiera metody wysyłania żądań HTTP i przechwytywania kodu odpowiedzi HTTP. Zatem wynik metody openConnection() (URLConnection) jest rzutowany na typ HttpURLConnection.

huc = (HttpURLConnection)(new URL(url).openConnection());

Możemy ustawić typ żądania jako „HEAD” zamiast „GET”. Aby zwracane były tylko nagłówki, a nie treść dokumentu.

huc.setRequestMethod("HEAD");

Po wywołaniu metody connect() nawiązywane jest rzeczywiste połączenie z adresem URL i wysyłane jest żądanie.

huc.connect();

Krok 5: Sprawdzanie linków

Za pomocą metody 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");
}

W ten sposób możemy uzyskać wszystkie linki ze strony internetowej i wydrukować, czy linki są ważne, czy uszkodzone.

Mam nadzieję, że ten poradnik pomoże Ci sprawdzić uszkodzone linki za pomocą selenu.

Jak zdobyć WSZYSTKIE linki do strony internetowej

Jedna z typowych procedur w pliku web Testowanie 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 WWW ze znacznikiem a. Dostęp do każdego elementu można uzyskać za pomocą pętli for-each.

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 = "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();			
    }		
}

Dane wyjściowe powinny być podobne do wskazanych poniżej.

  • Dostęp do łączy 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 łączem, do którego uzyskany zostanie dostęp z kodu, może być łącze „Strona główna”. W takim przypadku akcja Driver.navigate.back() wyświetli pustą stronę, ponieważ pierwszą akcją będzie otwarcie przeglądarki. Sterownik nie będzie mógł znaleźć wszystkich innych linków w pustej przeglądarce. Zatem IDE zgłosi wyjątek i reszta kodu nie zostanie wykonana. Można to łatwo obsłużyć za pomocą pętli If.