Πώς να βρείτε κατεστραμμένους συνδέσμους Selenium
⚡ Έξυπνη Σύνοψη
Εύρεση κατεστραμμένων συνδέσμων σε Selenium Το WebDriver περιλαμβάνει τη συλλογή κάθε ετικέτας αγκύρωσης, στέλνοντας ένα αίτημα HTTP HEAD σε κάθε μία από αυτές. URLκαι ανάγνωση του κωδικού απόκρισης. Οι σύνδεσμοι που επιστρέφουν 400 ή μεγαλύτερο αριθμό επισημαίνονται ως κατεστραμμένοι, ενώ οι έγκυροι σύνδεσμοι επιστρέφουν κωδικούς 2xx.

Τι είναι οι κατεστραμμένοι σύνδεσμοι;
Οι σπασμένοι σύνδεσμοι είναι σύνδεσμοι ή URLπου δεν είναι προσβάσιμα. Ενδέχεται να είναι εκτός λειτουργίας ή να μην λειτουργούν λόγω κάποιου σφάλματος διακομιστή.
A URL θα έχει πάντα μια κατάσταση με 2xx, η οποία είναι έγκυρη. Υπάρχουν διαφορετικοί κωδικοί κατάστασης HTTP που έχουν διαφορετικούς σκοπούς. Για ένα μη έγκυρο αίτημα, η κατάσταση HTTP είναι 4xx και 5xx.
Η κλάση 4xx του κωδικού κατάστασης αφορά κυρίως σφάλματα από την πλευρά του πελάτη και η κλάση 5xx των κωδικών κατάστασης αφορά κυρίως σφάλματα απόκρισης διακομιστή.
Πιθανότατα δεν θα μπορέσουμε να επιβεβαιώσουμε εάν αυτός ο σύνδεσμος λειτουργεί ή όχι μέχρι να τον κάνουμε κλικ και να τον επιβεβαιώσουμε.
Γιατί πρέπει να ελέγξετε τους κατεστραμμένους συνδέσμους;
Θα πρέπει πάντα να βεβαιώνεστε ότι δεν υπάρχουν κατεστραμμένοι σύνδεσμοι στον ιστότοπο, επειδή ο χρήστης δεν πρέπει να καταλήξει σε σελίδα σφάλματος.
Το σφάλμα παρουσιάζεται εάν οι κανόνες δεν ενημερωθούν σωστά ή οι ζητούμενοι πόροι δεν υπάρχουν στον διακομιστή.
Ο χειροκίνητος έλεγχος συνδέσμων είναι μια κουραστική εργασία, επειδή κάθε ιστοσελίδα μπορεί να έχει μεγάλο αριθμό συνδέσμων και η χειροκίνητη διαδικασία πρέπει να επαναληφθεί για όλες τις σελίδες.
Ένα σενάριο αυτοματισμού που χρησιμοποιεί Selenium που θα αυτοματοποιήσει τη διαδικασία είναι μια πιο κατάλληλη λύση.
Πώς να ελέγξετε τους κατεστραμμένους συνδέσμους και τις εικόνες Selenium
Για να ελέγξετε τους κατεστραμμένους συνδέσμους, θα χρειαστεί να κάνετε τα παρακάτω βήματα.
- Συλλέξτε όλους τους συνδέσμους στην ιστοσελίδα με βάση την ετικέτα.
- Στείλτε ένα αίτημα HTTP για τον σύνδεσμο και διαβάστε τον κώδικα απόκρισης HTTP.
- Μάθετε αν ο σύνδεσμος είναι έγκυρος ή κατεστραμμένος με βάση τον κώδικα απόκρισης HTTP.
- Επαναλάβετε αυτό για όλους τους συνδέσμους που καταγράφηκαν.
Code για να βρείτε τους σπασμένους συνδέσμους σε μια ιστοσελίδα
Ακολουθεί ο κώδικας προγράμματος οδήγησης web που δοκιμάζει την περίπτωση χρήσης μας:
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(); } }
Εξήγηση του κώδικα των κατεστραμμένων συνδέσμων
Βήμα 1: Εισαγωγή πακέτων
Εισαγάγετε το παρακάτω πακέτο εκτός από τα προεπιλεγμένα πακέτα:
import java.net.HttpURLConnection;
Χρησιμοποιώντας τις μεθόδους σε αυτό το πακέτο, μπορούμε να στείλουμε αιτήματα HTTP και να συλλάβουμε κωδικούς απόκρισης HTTP από την απάντηση.
Βήμα 2: Συλλέξτε όλους τους συνδέσμους στην ιστοσελίδα
Προσδιορίστε όλους τους συνδέσμους σε μια ιστοσελίδα και αποθηκεύστε τους σε μια λίστα.
List<WebElement> links = driver.findElements(By.tagName("a"));
Αποκτήστε έναν Επαναλήπτη για να διασχίσετε τη Λίστα.
Iterator<WebElement> it = links.iterator();
Βήμα 3: Αναγνώριση και Επικύρωση URL
Σε αυτό το μέρος, θα ελέγξουμε αν ένα URL ανήκει σε τομέα τρίτου μέρους ή αν το URL είναι κενό/μηδενικό.
Λάβετε το href της ετικέτας αγκύρωσης και αποθηκεύστε το στη μεταβλητή url.
url = it.next().getAttribute("href");
Ελέγξτε εάν το URL είναι null ή κενό και παραλείψτε τα υπόλοιπα βήματα εάν η συνθήκη ικανοποιείται.
if(url == null || url.isEmpty()){ System.out.println("URL is either not configured for anchor tag or it is empty"); continue; }
Ελέγξτε αν το URL ανήκει σε έναν κύριο τομέα ή σε τρίτο μέρος. Παραλείψτε τα υπόλοιπα βήματα εάν ανήκει σε έναν τομέα τρίτου μέρους.
if(!url.startsWith(homePage)){ System.out.println("URL belongs to another domain, skipping it."); continue; }
Βήμα 4: Αποστολή αιτήματος HTTP
Το HttpURLΗ κλάση σύνδεσης έχει μεθόδους για την αποστολή ενός αιτήματος HTTP και την καταγραφή του κώδικα απόκρισης HTTP. Έτσι, η έξοδος της μεθόδου openConnection() (URLΣύνδεση) έχει τύπο μετατροπής σε HttpURLΣύνδεση.
huc = (HttpURLConnection)(new URL(url).openConnection());
Μπορούμε να ορίσουμε τον τύπο αιτήματος ως "HEAD" αντί για "GET", έτσι ώστε να επιστρέφονται μόνο οι κεφαλίδες και όχι το σώμα του εγγράφου.
huc.setRequestMethod("HEAD");
Κατά την κλήση της μεθόδου connect(), δημιουργείται η πραγματική σύνδεση με τη διεύθυνση url και αποστέλλεται το αίτημα.
huc.connect();
Βήμα 5: Επικύρωση συνδέσμων
Χρησιμοποιώντας το getResponseCode(), μπορούμε να λάβουμε τον κωδικό απόκρισης για το αίτημα.
respCode = huc.getResponseCode();
Με βάση τον κωδικό απόκρισης, θα προσπαθήσουμε να ελέγξουμε την κατάσταση του συνδέσμου.
if(respCode >= 400){ System.out.println(url+" is a broken link"); } else{ System.out.println(url+" is a valid link"); }
Έτσι, μπορούμε να λάβουμε όλους τους συνδέσμους από μια ιστοσελίδα και να εκτυπώσουμε αν οι σύνδεσμοι είναι έγκυροι ή κατεστραμμένοι.
Πώς να αποκτήσετε ΟΛΟΥΣ τους συνδέσμους μιας ιστοσελίδας
Μία από τις κοινές διαδικασίες στο web Δοκιμές είναι να ελέγξετε εάν λειτουργούν όλοι οι σύνδεσμοι που υπάρχουν στη σελίδα. Αυτό μπορεί να γίνει εύκολα χρησιμοποιώντας έναν συνδυασμό των Java για κάθε βρόχο, findElements() & By.tagName("a") μέθοδος.
Η μέθοδος findElements() επιστρέφει μια λίστα με στοιχεία ιστού με την ετικέτα a. Χρησιμοποιώντας έναν βρόχο for-each, γίνεται πρόσβαση σε κάθε στοιχείο.
Ο παρακάτω κώδικας WebDriver ελέγχει κάθε σύνδεσμο από το Mercury Περιηγήσεις στην αρχική σελίδα για να προσδιορίσει αυτά που λειτουργούν και αυτά που είναι ακόμη υπό κατασκευή.
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(); } }
Η έξοδος πρέπει να είναι παρόμοια με αυτή που υποδεικνύεται παρακάτω.
- Η πρόσβαση σε συνδέσμους εικόνων γίνεται χρησιμοποιώντας τις μεθόδους By.cssSelector() και By.xpath().
Αντιμετώπιση προβλημάτων
Σε μια μεμονωμένη περίπτωση, ο πρώτος σύνδεσμος στον οποίο έχει πρόσβαση ο κώδικας θα μπορούσε να είναι ο σύνδεσμος "Αρχική". Σε μια τέτοια περίπτωση, η ενέργεια driver.navigate.back() θα εμφανίσει μια κενή σελίδα, καθώς η πρώτη ενέργεια είναι το άνοιγμα ενός προγράμματος περιήγησης. Το πρόγραμμα οδήγησης δεν θα μπορεί να βρει όλους τους άλλους συνδέσμους σε ένα κενό πρόγραμμα περιήγησης. Έτσι, το IDE θα δημιουργήσει μια εξαίρεση και ο υπόλοιπος κώδικας δεν θα εκτελεστεί. Αυτό μπορεί εύκολα να αντιμετωπιστεί χρησιμοποιώντας έναν βρόχο If.


.png)