Πώς να βρείτε κατεστραμμένους συνδέσμους Selenium

⚡ Έξυπνη Σύνοψη

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

  • 🔗 Ορισμός: Ένας σπασμένος σύνδεσμος είναι ένα URL που δεν είναι προσβάσιμο, συνήθως επιστρέφοντας ένα σφάλμα 4xx ή 5xx.
  • 🧭 Γιατί έχει σημασία: Οι κατεστραμμένοι σύνδεσμοι βλάπτουν την εμπειρία χρήστη και το SEO, επομένως οι αυτοματοποιημένοι έλεγχοι αντικαθιστούν την αργή μη αυτόματη επαλήθευση.
  • 📥 Συλλογή συνδέσμων: Χρησιμοποιήστε την συνάρτηση findElements με την συνάρτηση By.tagName(“a”) για να συγκεντρώσετε κάθε στοιχείο αγκύρωσης στη σελίδα σε μια λίστα.
  • 📡 Αποστολή αιτήματος HEAD: Άνοιγμα HttpURLΣύνδεση, ορίστε τη μέθοδο σε HEAD και διαβάστε τον κώδικα απόκρισης ανά URL.
  • Επικύρωση κατάστασης: Αντιμετωπίστε έναν κωδικό απόκρισης 400 ή μεγαλύτερο ως προβληματικό και οποιονδήποτε κώδικα 2xx ως λειτουργικό σύνδεσμο.

Πώς να βρείτε κατεστραμμένους συνδέσμους Selenium

Τι είναι οι κατεστραμμένοι σύνδεσμοι;

Οι σπασμένοι σύνδεσμοι είναι σύνδεσμοι ή URLπου δεν είναι προσβάσιμα. Ενδέχεται να είναι εκτός λειτουργίας ή να μην λειτουργούν λόγω κάποιου σφάλματος διακομιστή.

A URL θα έχει πάντα μια κατάσταση με 2xx, η οποία είναι έγκυρη. Υπάρχουν διαφορετικοί κωδικοί κατάστασης HTTP που έχουν διαφορετικούς σκοπούς. Για ένα μη έγκυρο αίτημα, η κατάσταση HTTP είναι 4xx και 5xx.

Η κλάση 4xx του κωδικού κατάστασης αφορά κυρίως σφάλματα από την πλευρά του πελάτη και η κλάση 5xx των κωδικών κατάστασης αφορά κυρίως σφάλματα απόκρισης διακομιστή.

Πιθανότατα δεν θα μπορέσουμε να επιβεβαιώσουμε εάν αυτός ο σύνδεσμος λειτουργεί ή όχι μέχρι να τον κάνουμε κλικ και να τον επιβεβαιώσουμε.

Γιατί πρέπει να ελέγξετε τους κατεστραμμένους συνδέσμους;

Θα πρέπει πάντα να βεβαιώνεστε ότι δεν υπάρχουν κατεστραμμένοι σύνδεσμοι στον ιστότοπο, επειδή ο χρήστης δεν πρέπει να καταλήξει σε σελίδα σφάλματος.

Το σφάλμα παρουσιάζεται εάν οι κανόνες δεν ενημερωθούν σωστά ή οι ζητούμενοι πόροι δεν υπάρχουν στον διακομιστή.

Ο χειροκίνητος έλεγχος συνδέσμων είναι μια κουραστική εργασία, επειδή κάθε ιστοσελίδα μπορεί να έχει μεγάλο αριθμό συνδέσμων και η χειροκίνητη διαδικασία πρέπει να επαναληφθεί για όλες τις σελίδες.

Ένα σενάριο αυτοματισμού που χρησιμοποιεί Selenium που θα αυτοματοποιήσει τη διαδικασία είναι μια πιο κατάλληλη λύση.

Πώς να ελέγξετε τους κατεστραμμένους συνδέσμους και τις εικόνες Selenium

Για να ελέγξετε τους κατεστραμμένους συνδέσμους, θα χρειαστεί να κάνετε τα παρακάτω βήματα.

  1. Συλλέξτε όλους τους συνδέσμους στην ιστοσελίδα με βάση την ετικέτα.
  2. Στείλτε ένα αίτημα HTTP για τον σύνδεσμο και διαβάστε τον κώδικα απόκρισης HTTP.
  3. Μάθετε αν ο σύνδεσμος είναι έγκυρος ή κατεστραμμένος με βάση τον κώδικα απόκρισης HTTP.
  4. Επαναλάβετε αυτό για όλους τους συνδέσμους που καταγράφηκαν.

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.

Συχνές Ερωτήσεις

Selenium συλλέγει όλες τις ετικέτες αγκύρωσης, στέλνει ένα αίτημα HTTP HEAD σε κάθε μία URLκαι επισημαίνει οποιονδήποτε σύνδεσμο που επιστρέφει 400 ή υψηλότερο ως κατεστραμμένο.

Ένας κωδικός 4xx υποδεικνύει ένα πρόβλημα στην πλευρά του πελάτη, όπως μια σελίδα που λείπει, ενώ ένας κωδικός 5xx υποδεικνύει μια αποτυχία στην πλευρά του διακομιστή κατά την επεξεργασία του αιτήματος.

Ναι. Οι πηγές εικόνων συλλέγονται με By.cssSelector() ή By.xpath() και στη συνέχεια κάθε src URL επικυρώνεται μέσω του κώδικα απόκρισης HTTP.

Ναι. Τα προγράμματα ανίχνευσης που βασίζονται σε τεχνητή νοημοσύνη σαρώνουν σελίδες, ακολουθούν συνδέσμους και επισημαίνουν ότι οι σελίδες είναι κατεστραμμένες ή ότι ανακατευθύνουν τις σελίδες. URLs χωρίς χειροκίνητη δημιουργία σεναρίων.

Η τεχνητή νοημοσύνη παρακολουθεί την εύρυθμη λειτουργία των συνδέσμων με την πάροδο του χρόνου, προβλέπει βλάβες και προτείνει αντικαταστάσεις, μειώνοντας τους επαναλαμβανόμενους χειροκίνητους ελέγχους συνδέσμων.

Συνοψίστε αυτήν την ανάρτηση με: