Come trovare collegamenti interrotti in Selenium

Cosa sono i collegamenti interrotti?

I collegamenti interrotti sono collegamenti o URL che non sono raggiungibili. Potrebbero essere inattivi o non funzionare a causa di qualche errore del server

Un URL avrà sempre uno stato con 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 4xx del codice di stato è principalmente per l'errore lato client, mentre la classe 5xx dei codici di stato è principalmente per l'errore 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?

Dovresti sempre assicurarti che non ci siano collegamenti interrotti sul sito perché l'utente non dovrebbe arrivare a 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 collegamenti è un compito noioso, perché ogni pagina web può avere un gran numero di collegamenti 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 collegamenti nella pagina Web in base al tag.
  2. Invia una richiesta HTTP per il collegamento e leggi il codice di risposta HTTP.
  3. Scopri se il collegamento è valido o interrotto in base al codice di risposta HTTP.
  4. Ripeti l'operazione per tutti i collegamenti catturati.

Codice per trovare i collegamenti interrotti 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

Identificare tutti i collegamenti in una pagina Web e memorizzarli nell'elenco.

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

Ottieni Iterator per attraversare l'elenco.

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

Passaggio 3: identificazione e convalida dell'URL

In questa parte controlleremo se l'URL appartiene a un dominio di terze parti o se l'URL è vuoto/nullo.

Ottieni href del tag di ancoraggio e memorizzalo nella variabile URL.

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

Controlla se l'URL è nullo o vuoto e 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 l'URL appartiene a un dominio principale o a terze parti. Salta i passaggi rimanenti se appartiene a un dominio di terze parti.

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

Passaggio 4: invia la richiesta http

La classe HttpURLConnection dispone di metodi per inviare richieste HTTP e acquisire il codice di risposta HTTP. Pertanto, l'output del metodo openConnection() (URLConnection) viene convertito in HttpURLConnection.

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

Possiamo impostare il tipo di richiesta come "HEAD" invece di "GET". In modo che vengano restituite solo le intestazioni e non il corpo del documento.

huc.setRequestMethod("HEAD");

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

huc.connect();

Passaggio 5: convalida dei collegamenti

Utilizzando il metodo getResponseCode() 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");
}

Pertanto, possiamo ottenere tutti i collegamenti dalla pagina Web e stampare se i collegamenti sono validi o interrotti.

Spero che questo tutorial ti aiuti a controllare i collegamenti interrotti utilizzando il selenio.

Come ottenere TUTTI i collegamenti di una pagina Web

Una delle procedure comuni in web Testing è 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 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 = "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();			
    }		
}

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

  • L'accesso ai collegamenti alle immagini viene effettuato utilizzando i metodi By.cssSelector() e By.xpath().

Ottieni TUTTI i collegamenti di una pagina Web

Risoluzione dei problemi

In un caso isolato, il primo collegamento a cui accede il codice potrebbe essere il collegamento “Home”. In tal caso, l'azione driver.navigate.back() mostrerà una pagina vuota poiché la prima azione sta aprendo un browser. Il driver non sarà in grado di trovare tutti gli altri collegamenti in un browser vuoto. Quindi l'IDE genererà un'eccezione e il resto del codice non verrà eseguito. Questo può essere facilmente gestito utilizzando un ciclo If.