Ο έλεγχος ταυτότητας μέσω proxy στο Selenium γίνεται δύσκολος όταν το πρόγραμμα περιήγησης —όχι η ιστοσελίδα— ζητά όνομα χρήστη και κωδικό πρόσβασης. Η σωστή λύση εξαρτάται από τον τύπο του proxy, το πρόγραμμα περιήγησης, την έκδοση του Selenium και από το εάν τα διαπιστευτήρια μπορούν να παρασχεθούν εκτός της δοκιμής. Αυτός ο οδηγός εξηγεί τις αξιόπιστες προσεγγίσεις του Selenium 4, πού εξακολουθούν να ισχύουν παλαιότερες λύσεις και γιατί ο κώδικας χειρισμού ειδοποιήσεων συχνά αποτυγχάνει.

Τι είναι ο διακομιστής μεσολάβησης;

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

Μια διεύθυνση URL διακομιστή μεσολάβησης συνήθως περιέχει έναν κεντρικό υπολογιστή και μια θύρα, όπως π.χ. proxy.example.test:8080Οι ιδιωτικές υπηρεσίες ενδέχεται επίσης να απαιτούν όνομα χρήστη και κωδικό πρόσβασης. Το Selenium μπορεί να διαμορφώσει το τελικό σημείο διακομιστή μεσολάβησης μέσω των επιλογών του προγράμματος περιήγησης, αλλά οι προτροπές ελέγχου ταυτότητας ελέγχονται από το πρόγραμμα περιήγησης και δεν εκτίθενται πάντα στο WebDriver όπως μια συνηθισμένη φόρμα HTML.

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

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

Διαφορά μεταξύ SOCKS και διακομιστή μεσολάβησης HTTP

Οι διακομιστές μεσολάβησης HTTP κατανοούν την κίνηση ιστού και συνήθως διαμορφώνονται με ξεχωριστές τιμές HTTP και HTTPS. Οι διακομιστές μεσολάβησης SOCKS λειτουργούν σε χαμηλότερο επίπεδο και μπορούν να μεταφέρουν διαφορετικά είδη κίνησης TCP χωρίς να ερμηνεύουν το πρωτόκολλο της εφαρμογής. Το SOCKS5 υποστηρίζει επιπλέον έλεγχο ταυτότητας και είναι συνήθως η προτιμώμενη έκδοση SOCKS.

ΧαρακτηριστικόςΔιακομιστής μεσολάβησης HTTP/HTTPSΔιακομιστής μεσολάβησης SOCKS5
ΕπισκεψιμότηταΣχεδιασμένο για αιτήματα ιστού προγράμματος περιήγησηςΛειτουργεί με πολλαπλές εφαρμογές που βασίζονται στο TCP
Επίγνωση πρωτοκόλλουΚατανοεί τα αιτήματα HTTP και τις κεφαλίδεςΠροωθεί την κίνηση χωρίς να διαβάζει σημασιολογία HTTP
Ρύθμιση σεληνίουΟρισμός πεδίων διακομιστή μεσολάβησης HTTP και SSLΟρίστε το τελικό σημείο και την έκδοση του SOCKS
Τυπική χρήσηΔοκιμές ιστού, φιλτράρισμα, προσωρινή αποθήκευση, επιθεώρησηΕυέλικτη διοχέτευση και κίνηση χωρίς HTTP

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

Πώς να χειριστείτε το Proxy στο Selenium Webdriver στο Chrome

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

import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

Proxy proxy = new Proxy();
proxy.setHttpProxy("proxy.example.test:8080");
proxy.setSslProxy("proxy.example.test:8080");

ChromeOptions options = new ChromeOptions();
options.setProxy(proxy);

WebDriver driver = new ChromeDriver(options);
driver.get("https://example.com");

Για το SOCKS5, ορίστε το τελικό σημείο και την έκδοση του SOCKS:

Proxy proxy = new Proxy();
proxy.setSocksProxy("proxy.example.test:1080");
proxy.setSocksVersion(5);

ChromeOptions options = new ChromeOptions();
options.setProxy(proxy);

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

  1. Καταχώριση σε λίστα επιτρεπόμενων IP: Εξουσιοδοτήστε τη σταθερή δημόσια IP του δρομέα CI ή του κόμβου Selenium Grid, ώστε να μην εμφανίζεται κανένα παράθυρο διαλόγου του προγράμματος περιήγησης.
  2. Τοπική πύλη: Τοποθετήστε έναν αξιόπιστο διακομιστή μεσολάβησης προώθησης στον δοκιμαστικό υπολογιστή. Το Selenium συνδέεται τοπικά χωρίς διαπιστευτήρια και η πύλη ελέγχει την ταυτότητά της ανοδικά.
  3. Ελεγχόμενη επέκταση προγράμματος περιήγησης: Δημιουργήστε μια εσωτερική επέκταση Chrome που διαμορφώνει τον διακομιστή μεσολάβησης και απαντά σε προκλήσεις ελέγχου ταυτότητας. Φορτώστε την μόνο από ένα προστατευμένο τεχνούργημα δοκιμής.
  4. Διαμόρφωση σε επίπεδο πλέγματος: Ρυθμίστε τη δικτύωση και τα μυστικά στον κόμβο Selenium αντί να διανέμετε διαπιστευτήρια σε κάθε δοκιμή.

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

Συνήθης βλάβη: ERR_PROXY_CONNECTION_FAILED συνήθως υποδεικνύει ότι ο κεντρικός υπολογιστής, η θύρα, το πρωτόκολλο ή η διαδρομή δικτύου είναι λανθασμένα. Επαναλαμβανόμενη 407 Proxy Authentication Required Οι απαντήσεις υποδεικνύουν ελλείποντα ή απορριφθέντα διαπιστευτήρια.

Χρήση του εργαλείου AutoIt

Το AutoIt μπορεί να αυτοματοποιήσει τα παράθυρα διαλόγου των Windows εντοπίζοντας ένα παράθυρο, πληκτρολογώντας διαπιστευτήρια και πατώντας ένα κουμπί. Ήταν κάποτε μια συνηθισμένη λύση στο Selenium, επειδή το WebDriver δεν μπορούσε να χειριστεί παράθυρα ελέγχου ταυτότητας που ανήκουν σε προγράμματα περιήγησης.

Η μέθοδος είναι εύθραυστη: λειτουργεί μόνο για Windows, απαιτεί μια ξεκλείδωτη διαδραστική επιφάνεια εργασίας, εξαρτάται από τους τίτλους και τον χρονισμό των παραθύρων και συνήθως αποτυγχάνει σε headless containers ή σε απομακρυσμένους CI agents. Μπορεί επίσης να αποκαλύψει κωδικούς πρόσβασης μέσω σεναρίων ή ορισμάτων διεργασίας.

Εάν ένα παλαιότερο περιβάλλον δεν αφήνει εναλλακτική λύση, μεταγλωττίστε το σενάριο AutoIt, αποθηκεύστε το σε μια ελεγχόμενη θέση δοκιμής-τεχνουργήματος, ανακτήστε με ασφάλεια τα διαπιστευτήρια κατά τον χρόνο εκτέλεσης και περιμένετε το ακριβές παράθυρο διαλόγου αντί να χρησιμοποιήσετε μια σταθερή κατάσταση αναστολής λειτουργίας. Περιορίστε αυτήν την τεχνική σε έναν απομονωμένο εκτελέστη των Windows. Για σουίτες με δυνατότητα συντήρησης, η προσθήκη σε λίστα επιτρεπόμενων IP, μια πύλη ή κεντρικά διαμορφωμένοι κόμβοι Grid είναι ασφαλέστερες επιλογές.

Χρήση ειδοποιήσεων

Το Selenium μπορεί να χειριστεί ειδοποιήσεις JavaScript που δημιουργούνται από κώδικα ιστοσελίδας:

Alert alert = new WebDriverWait(driver, Duration.ofSeconds(10))
    .until(ExpectedConditions.alertIsPresent());
alert.accept();

Ωστόσο, ένα παράθυρο διαλόγου ελέγχου ταυτότητας proxy είναι συνήθως ένα πρόγραμμα περιήγησης Chrome και όχι μια ειδοποίηση JavaScript. Επομένως, driver.switchTo().alert() συχνά πετάει NoAlertPresentException ακόμα και όταν είναι ορατό ένα μήνυμα προτροπής για διαπιστευτήρια. Ο ίδιος περιορισμός ισχύει για πολλά παράθυρα διαλόγου βασικής εξουσιοδότησης HTTP.

Χρησιμοποιήστε το API ειδοποίησης μόνο αφού επιβεβαιώσετε ότι το WebDriver αναγνωρίζει την προτροπή. Εάν δεν την αναγνωρίζει, καταργήστε την προτροπή μέσω της ρύθμισης παραμέτρων δικτύου ή χρησιμοποιήστε μία από τις προσεγγίσεις μεσολάβησης με έλεγχο ταυτότητας που περιγράφονται παραπάνω. Αυτό είναι πιο σταθερό από τον συντονισμό των πληκτρολογήσεων με ένα παράθυρο που το Selenium δεν μπορεί να ελέγξει.

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

Μπορεί το Selenium να ορίσει απευθείας έναν proxy;

Ναι. Το Selenium 4 μπορεί να μεταβιβάσει ρυθμίσεις HTTP, SSL ή SOCKS μέσω των επιλογών και της δυνατότητας proxy του προγράμματος περιήγησης. Αυτό ρυθμίζει το τελικό σημείο, αλλά ενδέχεται να μην ολοκληρώσει μια προτροπή ελέγχου ταυτότητας που ανήκει στο πρόγραμμα περιήγησης.

Γιατί αποτυγχάνει η εντολή username:password@host:port στο Chrome;

Τα σύγχρονα προγράμματα περιήγησης ενδέχεται να αποκλείουν τα διαπιστευτήρια που είναι ενσωματωμένα σε διευθύνσεις URL και η σύνταξη μπορεί να διαρρεύσει μυστικά σε αρχεία καταγραφής και ιστορικό. Χρησιμοποιήστε αντί αυτού λίστα επιτρεπόμενων IP, μια ασφαλή πύλη ή ελεγχόμενη υποδομή δοκιμών.

Μπορεί το Selenium να χειριστεί μια σύνδεση proxy με switchTo().alert();

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

Λειτουργεί ο έλεγχος ταυτότητας proxy σε Chrome χωρίς κεφαλές;

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

Πρέπει να χρησιμοποιήσω το AutoIt για έλεγχο ταυτότητας μεσολάβησης Selenium;

Χρησιμοποιήστε το μόνο για μια περιορισμένη ροή εργασίας παλαιού τύπου των Windows. Είναι εύθραυστο στο CI και λιγότερο ασφαλές από την εξάλειψη του παραθύρου διαλόγου μέσω της διαμόρφωσης δικτύου.

Ποιος τύπος proxy είναι ο καλύτερος για αυτοματοποίηση προγράμματος περιήγησης;

Εξαρτάται από την εξουσιοδοτημένη εργασία. Οι διακομιστές μεσολάβησης HTTP είναι απλοί για την κυκλοφορία ιστού, το SOCKS5 είναι ευέλικτο και τα οικιακά δίκτυα μπορούν να βοηθήσουν με τον έλεγχο τοποθεσίας. Συγκρίνετε τις επιλογές στον οδηγό τύπων διακομιστών μεσολάβησης.