Come trovare collegamenti interrotti in Selenium

โšก Riepilogo intelligente

Trovare collegamenti interrotti in Selenium WebDriver prevede la raccolta di ogni tag di ancoraggio e l'invio di una richiesta HTTP HEAD a ciascuno URLe leggendo il codice di risposta. I link che restituiscono un codice 400 o superiore vengono segnalati come non funzionanti, mentre i link validi restituiscono codici 2xx.

  • ๐Ÿ”— Definizione: Un collegamento interrotto รจ un URL che non รจ raggiungibile, in genere restituisce un errore 4xx o 5xx.
  • ๐Ÿงญ Perchรฉ รจ importante: I link non funzionanti danneggiano l'esperienza utente e la SEO, pertanto i controlli automatizzati sostituiscono le lente verifiche manuali.
  • ๐Ÿ“ฅ Raccogli i link: Utilizza findElements con By.tagName("a") per raccogliere in un elenco tutti gli elementi di ancoraggio presenti nella pagina.
  • ๐Ÿ“ก Invia richiesta HEAD: Apri un HttpURLConnessione, imposta il metodo su HEAD e leggi il codice di risposta per URL.
  • โœ… Convalida lo stato: Considera un codice di risposta pari o superiore a 400 come un collegamento non funzionante e qualsiasi codice 2xx come un collegamento funzionante.

Come trovare collegamenti interrotti in Selenium

Cosa sono i collegamenti interrotti?

I link interrotti sono link o URLAlcuni servizi potrebbero non essere raggiungibili. Potrebbero essere inattivi o non funzionanti a causa di un errore del server.

A URL avrร  sempre uno stato 2xx, che รจ valido. Esistono diversi codici di stato HTTP che hanno scopi diversi. Per una richiesta non valida, lo stato HTTP รจ 4xx e 5xx.

La classe di codici di stato 4xx si riferisce principalmente agli errori lato client, mentre la classe di codici di stato 5xx si riferisce principalmente agli errori di risposta del server.

Molto probabilmente non saremo in grado di confermare se il collegamento funziona o meno finchรฉ non lo clicchiamo e lo confermiamo.

Perchรฉ dovresti controllare i collegamenti interrotti?

Bisogna sempre assicurarsi che sul sito non ci siano link non funzionanti, perchรฉ l'utente non deve assolutamente finire su una pagina di errore.

L'errore si verifica se le regole non vengono aggiornate correttamente o le risorse richieste non esistono sul server.

Il controllo manuale dei link รจ un'operazione tediosa, perchรฉ ogni pagina web puรฒ contenere un gran numero di link e il processo manuale deve essere ripetuto per tutte le pagine.

Uno script di automazione che utilizza Selenium che automatizzerร  il processo รจ una soluzione piรน adatta.

Come controllare i collegamenti e le immagini interrotti Selenium

Per verificare i link non funzionanti, รจ necessario procedere come segue.

  1. Raccogli tutti i link presenti nella pagina web in base al tag.
  2. Invia una richiesta HTTP per il link e leggi il codice di risposta HTTP.
  3. Scopri se il link รจ valido o non funzionante in base al codice di risposta HTTP.
  4. Ripeti l'operazione per tutti i collegamenti catturati.

Code Trovare i link non funzionanti su una pagina web

Di seguito รจ riportato il codice del driver Web che testa il nostro caso d'uso:

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

    }
}

Spiegare il codice dei collegamenti interrotti

Passaggio 1: importa i pacchetti

Importa il pacchetto seguente in aggiunta ai pacchetti predefiniti:

import java.net.HttpURLConnection;

Utilizzando i metodi presenti in questo pacchetto, possiamo inviare richieste HTTP e acquisire codici di risposta HTTP dalla risposta.

Passaggio 2: raccogli tutti i collegamenti nella pagina web

Individua tutti i link presenti in una pagina web e memorizzali in un elenco.

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

Ottieni un iteratore per scorrere la lista.

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

Fase 3: Identificazione e convalida URL

In questa parte, verificheremo se un URL appartiene a un dominio di terzi o se il URL รจ vuoto/nullo.

Ottieni l'attributo href del tag di ancoraggio e memorizzalo nella variabile url.

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

Controlla se il URL se รจ nullo o vuoto, salta i passaggi rimanenti se la condizione รจ soddisfatta.

if(url == null || url.isEmpty()){
              System.out.println("URL is either not configured for anchor tag or it is empty");
              continue;
     }

Controlla se il URL appartiene a un dominio principale o a un dominio di terzi. Se appartiene a un dominio di terzi, salta i passaggi successivi.

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

Passaggio 4: Invia richiesta HTTP

L'HTTPURLLa classe Connection ha metodi per inviare una richiesta HTTP e catturare il codice di risposta HTTP. Quindi, l'output del metodo openConnection() (URLLa connessione) viene convertita in HttpURLConnessione.

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

Possiamo impostare il tipo di richiesta su "HEAD" anzichรฉ su "GET", in modo che vengano restituite solo le intestazioni e non il corpo del documento.

huc.setRequestMethod("HEAD");

Quando si richiama il metodo connect(), viene stabilita la connessione effettiva all'URL e la richiesta viene inviata.

huc.connect();

Passaggio 5: convalida dei collegamenti

Utilizzando getResponseCodeUtilizzando il metodo (), possiamo ottenere il codice di risposta per la richiesta.

respCode = huc.getResponseCode();

In base al codice di risposta, proveremo a verificare lo stato del collegamento.

if(respCode >= 400){
        System.out.println(url+" is a broken link");
}
else{
        System.out.println(url+" is a valid link");
}

In questo modo, possiamo ottenere tutti i link presenti in una pagina web e indicare se i link sono validi o non funzionanti.

Come ottenere TUTTI i collegamenti di una pagina Web

Una delle procedure comuni in web Collaudo รจ testare se tutti i link presenti all'interno della pagina funzionano. Questo puรฒ essere fatto comodamente utilizzando una combinazione di Java per ogni ciclo, trovaElementi() & Per.nometag("a") metodo.

Il metodo findElements() restituisce un elenco di elementi Web con il tag a. Utilizzando un ciclo for-each, si accede a ciascun elemento.

Ottieni TUTTI i collegamenti di una pagina Web

Il codice WebDriver riportato di seguito controlla ciascun collegamento da Mercury Homepage dei tour per determinare quelli che funzionano e quelli che sono ancora in costruzione.

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

L'output dovrebbe essere simile a quello indicato di seguito.

  • L'accesso ai link delle immagini avviene tramite i metodi By.cssSelector() e By.xpath().

Ottieni TUTTI i collegamenti di una pagina Web

Risoluzione dei problemi

In un caso isolato, il primo link a cui il codice accede potrebbe essere il link "Home". In tal caso, l'azione driver.navigate.back() mostrerร  una pagina vuota, poichรฉ la prima azione consiste nell'aprire un browser. Il driver non sarร  in grado di trovare tutti gli altri link in un browser vuoto. Pertanto, l'IDE genererร  un'eccezione e il resto del codice non verrร  eseguito. Questo problema puรฒ essere facilmente gestito utilizzando un ciclo If.

DOMANDE FREQUENTI

Selenium raccoglie tutti i tag di ancoraggio, invia una richiesta HTTP HEAD a ciascuno URLe contrassegna come non funzionante qualsiasi collegamento che restituisca un codice di errore pari o superiore a 400.

Un codice 4xx indica un problema lato client, come ad esempio una pagina mancante, mentre un codice 5xx indica un errore lato server durante l'elaborazione della richiesta.

Sรฌ. Le sorgenti delle immagini vengono raccolte con By.cssSelector() o By.xpath(), e poi ogni src URL viene convalidato tramite il suo codice di risposta HTTP.

Sรฌ. I crawler basati sull'IA scansionano le pagine, seguono i link e segnalano i link interrotti o che reindirizzano URLsenza scripting manuale.

L'intelligenza artificiale monitora lo stato di salute dei collegamenti nel tempo, prevede i guasti e suggerisce le sostituzioni, riducendo la necessitร  di ripetuti controlli manuali.

Riassumi questo post con: