Πώς να βρείτε κατεστραμμένους συνδέσμους Selenium
Τι είναι οι κατεστραμμένοι σύνδεσμοι;
Οι κατεστραμμένοι σύνδεσμοι είναι σύνδεσμοι ή διευθύνσεις URL που δεν είναι προσβάσιμες. Μπορεί να είναι εκτός λειτουργίας ή να μην λειτουργούν λόγω κάποιου σφάλματος διακομιστή
Μια διεύθυνση 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 για να διασχίσετε τη Λίστα.
Iterator<WebElement> it = links.iterator();
Βήμα 3: Προσδιορισμός και επικύρωση διεύθυνσης URL
Σε αυτό το μέρος, θα ελέγξουμε εάν η διεύθυνση URL ανήκει σε τομέα τρίτου μέρους ή εάν η διεύθυνση URL είναι κενή/μηδενική.
Λάβετε href of anchor tag και αποθηκεύστε την στη μεταβλητή url.
url = it.next().getAttribute("href");
Ελέγξτε εάν η διεύθυνση URL είναι null ή Empty και παραλείψτε τα υπόλοιπα βήματα εάν η συνθήκη ικανοποιείται.
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
Η κλάση σύνδεσης HttpURLC έχει μεθόδους αποστολής αιτήματος HTTP και λήψης κώδικα απόκρισης HTTP. Έτσι, η έξοδος της μεθόδου openConnection() (URLConnection) μεταδίδεται με τύπο στο HttpURLConnection.
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(), επιστρέφει μια λίστα στοιχείων Web με ετικέτα a. Χρησιμοποιώντας έναν βρόχο για κάθε βρόχο, γίνεται πρόσβαση σε κάθε στοιχείο.
Ο παρακάτω κώδικας 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() θα εμφανίσει μια κενή σελίδα καθώς η 1η ενέργεια ανοίγει ένα πρόγραμμα περιήγησης. Το πρόγραμμα οδήγησης δεν θα μπορεί να βρει όλους τους άλλους συνδέσμους σε ένα κενό πρόγραμμα περιήγησης. Έτσι, το IDE θα δημιουργήσει μια εξαίρεση και ο υπόλοιπος κώδικας δεν θα εκτελεστεί. Αυτό μπορεί να αντιμετωπιστεί εύκολα χρησιμοποιώντας έναν βρόχο If.


.png)