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.
- Raccogli tutti i collegamenti nella pagina Web in base al tag.
- Invia una richiesta HTTP per il collegamento e leggi il codice di risposta HTTP.
- Scopri se il collegamento è valido o interrotto in base al codice di risposta HTTP.
- 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.
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().
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.