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.

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.
- Raccogli tutti i link presenti nella pagina web in base al tag.
- Invia una richiesta HTTP per il link e leggi il codice di risposta HTTP.
- Scopri se il link รจ valido o non funzionante in base al codice di risposta HTTP.
- 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.
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().
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.


.png)