Πώς να περιμένετε να φορτωθεί μια σελίδα με σελήνιο

How Wait Page Load With Selenium



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

Ο λόγος που συμβαίνει αυτό είναι ότι το πρόγραμμα οδήγησης ιστού Selenium πρέπει να κατεβάσει την ιστοσελίδα και να ολοκληρώσει την απόδοση της σελίδας προτού μπορέσετε να κάνετε οτιδήποτε σε αυτήν. Στο παρελθόν, ο διακομιστής ιστού δημιουργούσε το περιεχόμενο μιας ιστοσελίδας και το πρόγραμμα περιήγησης μόλις το κατέβαζε και το απέδιδε. Αυτές τις μέρες έχουμε πολλές διαδικτυακές εφαρμογές μιας σελίδας που λειτουργούν λίγο διαφορετικά. Στις Εφαρμογές Ιστού Μίας Σελίδας (SPA), ο διακομιστής ιστού εξυπηρετεί μόνο τους κωδικούς πρόσβασης. Μόλις αποδοθεί ο κωδικός πρόσβασης στο πρόγραμμα περιήγησης, ο κώδικας προσώπου χρησιμοποιεί το AJAX για να ζητήσει δεδομένα API στον διακομιστή ιστού. Μόλις το frontend λάβει τα δεδομένα API, τα αποδίδει στο πρόγραμμα περιήγησης. Έτσι, παρόλο που το πρόγραμμα περιήγησης έχει ολοκληρώσει τη λήψη και την απόδοση της ιστοσελίδας, η ιστοσελίδα δεν είναι ακόμα έτοιμη. Πρέπει να περιμένετε να λάβει τα δεδομένα API και να τα αποδώσετε επίσης. Έτσι, η λύση σε αυτό το πρόβλημα είναι να περιμένουμε να είναι διαθέσιμα τα δεδομένα πριν κάνουμε οτιδήποτε με το Σελήνιο.







Στο Σελήνιο, υπάρχουν 2 τύποι αναμονής:
1) Σιωπηρή αναμονή
2) Ρητή αναμονή



1) Σιωπηρή αναμονή: Αυτό είναι το πιο εύκολο στην εφαρμογή. Μια σιωπηρή αναμονή λέει στο πρόγραμμα οδήγησης ιστού Selenium να περιμένει για αρκετά δευτερόλεπτα για να είναι έτοιμο το DOM (μοντέλο αντικειμένου εγγράφου) (η ιστοσελίδα να είναι έτοιμη).



2) Ρητή αναμονή: Αυτό είναι λίγο περίπλοκο από την υπονοούμενη αναμονή. Σε ρητή αναμονή, λέτε στο πρόγραμμα οδήγησης Selenium τι να περιμένετε. Το σελήνιο περιμένει να εκπληρωθεί η συγκεκριμένη προϋπόθεση. Μόλις ολοκληρωθεί, το πρόγραμμα οδήγησης ιστού Selenium θα είναι έτοιμο να λάβει άλλες εντολές. Συνήθως, ο ρητός χρόνος αναμονής είναι μεταβλητός. Εξαρτάται από το πόσο γρήγορα πληρούνται οι προϋποθέσεις. Στο χειρότερο σενάριο, η ρητή αναμονή θα περιμένει όσο η σιωπηρή αναμονή.





Σε αυτό το άρθρο, θα σας δείξω πώς να περιμένετε (σιωπηρά και ρητά) για να φορτώσει μια σελίδα με Σελήνιο. Λοιπόν, ας ξεκινήσουμε.

Προαπαιτούμενα:

Για να δοκιμάσετε τις εντολές και τα παραδείγματα αυτού του άρθρου, πρέπει να έχετε,



1) Μια διανομή Linux (κατά προτίμηση Ubuntu) εγκατεστημένη στον υπολογιστή σας.
2) Το Python 3 είναι εγκατεστημένο στον υπολογιστή σας.
3) Το PIP 3 είναι εγκατεστημένο στον υπολογιστή σας.
4) Python virtualenv πακέτο εγκατεστημένο στον υπολογιστή σας.
5) Τα προγράμματα περιήγησης Mozilla Firefox ή Google Chrome που είναι εγκατεστημένα στον υπολογιστή σας.
6) Πρέπει να γνωρίζετε πώς να εγκαταστήσετε το Firefox Gecko Driver ή το Chrome Web Driver.

Για την εκπλήρωση των απαιτήσεων 4, 5 και 6, διαβάστε το άρθρο μου Εισαγωγή στο σελήνιο με Python 3 στο Linuxhint.com.

Μπορείτε να βρείτε πολλά άρθρα για τα άλλα θέματα LinuxHint.com Το Φροντίστε να τα ελέγξετε αν χρειάζεστε βοήθεια.

Δημιουργία καταλόγου έργου:

Για να διατηρήσετε τα πάντα οργανωμένα, δημιουργήστε έναν νέο κατάλογο έργου σελήνιο-αναμονή/ ως εξής:

$mkdir -pvσελήνιο-περίμενε/οδηγοί

Πλοηγηθείτε στο σελήνιο-αναμονή/ κατάλογος έργου ως εξής:

$CDσελήνιο-περίμενε/

Δημιουργήστε ένα εικονικό περιβάλλον Python στον κατάλογο έργου ως εξής:

$virtualenv .venv

Ενεργοποιήστε το εικονικό περιβάλλον ως εξής:

$πηγή.venv/είμαι/θέτω εις ενέργειαν

Εγκαταστήστε το Σελήνιο χρησιμοποιώντας το PIP3 ως εξής:

$ pip3 εγκατάσταση σεληνίου

Κατεβάστε και εγκαταστήστε όλα τα απαιτούμενα προγράμματα οδήγησης ιστού στο οδηγοί/ κατάλογο του έργου. Έχω εξηγήσει τη διαδικασία λήψης και εγκατάστασης προγραμμάτων οδήγησης ιστού στο άρθρο μου Εισαγωγή στο σελήνιο με Python 3 Το Εάν χρειάζεστε οποιαδήποτε βοήθεια, αναζητήστε LinuxHint.com για αυτό το άρθρο.

Θα χρησιμοποιήσω το πρόγραμμα περιήγησης ιστού Google Chrome για την επίδειξη σε αυτό το άρθρο. Έτσι, θα χρησιμοποιήσω το chromedriver δυαδικό από το οδηγοί/ Ευρετήριο.

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

απόσελήνιοεισαγωγήwebdriver
απόσελήνιο.webdriverΤοκοινόςΤοκλειδιά εισαγωγήΚλειδιά
επιλογές=webdriver.Επιλογές Chrome()
επιλογές.ακέφαλος = Αληθής
πρόγραμμα περιήγησης=webdriver.Χρώμιο(εκτελέσιμη_διαδρομή='./drivers/chromedriver',επιλογές=επιλογές)
πρόγραμμα περιήγησης.υπονοούμενα_περίμενε(10)
πρόγραμμα περιήγησης.παίρνω('https://www.unixtimestamp.com/')
χρονική σήμανση=πρόγραμμα περιήγησης.find_element_by_xpath('// h3 [@] [1]')
Τυπώνω('Τρέχουσα χρονική σήμανση: %s'%(χρονική σήμανση.κείμενοΤοδιαίρεση('')[0]))
πρόγραμμα περιήγησης.Κλείσε()

Μόλις τελειώσετε, αποθηκεύστε το ex01.py Python script.

Οι γραμμές 1 και 2 εισάγουν όλα τα απαιτούμενα στοιχεία σεληνίου.

Η γραμμή 4 δημιουργεί ένα αντικείμενο Επιλογές Chrome.

Η γραμμή 5 ενεργοποιεί τη λειτουργία χωρίς κεφαλή για το πρόγραμμα οδήγησης ιστού Chrome.

Η γραμμή 7 δημιουργεί ένα αντικείμενο προγράμματος περιήγησης Chrome χρησιμοποιώντας το chromedriver δυαδικό από το οδηγοί/ Ευρετήριο.

Η γραμμή 8 χρησιμοποιείται για να πει στο Σελήνιο να περιμένει έμμεσα για 10 δευτερόλεπτα χρησιμοποιώντας το impliesly_wait () μέθοδος προγράμματος περιήγησης.

Η γραμμή 10 φορτώνει το www.unixtimestamp.com στο πρόγραμμα περιήγησης.

Η γραμμή 12 βρίσκει το στοιχείο χρονικής σήμανσης χρησιμοποιώντας τον επιλογέα XPath // h3 [@class = ’text-risk’] [1] και το αποθηκεύει στο χρονική σήμανση μεταβλητός.

Πήρα τον επιλογέα XPath από το Chrome Developer Tool. Όπως μπορείτε να δείτε, η χρονική σήμανση είναι στην πρώτη η3 στοιχείο με το όνομα της τάξης κείμενο-κίνδυνος Το Υπάρχουν 2 η3 στοιχεία με την τάξη κείμενο-κίνδυνος Το

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

Η γραμμή 14 κλείνει το πρόγραμμα περιήγησης.

Μόλις τελειώσετε, εκτελέστε το σενάριο Python ex01.py ως εξής:

$ python3 ex01.py

Όπως μπορείτε να δείτε, η τρέχουσα χρονική σήμανση εξάγεται από το unixtimestamp.com και εκτυπώνεται στην κονσόλα.

Εργασία με ρητή αναμονή:

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

απόσελήνιοεισαγωγήwebdriver
απόσελήνιο.webdriverΤοκοινόςΤοκλειδιά εισαγωγήΚλειδιά
απόσελήνιο.webdriverΤοκοινόςΤομε εισαγωγήΜε
απόσελήνιο.webdriverΤουποστήριξηΤοκρεμμύδι εισαγωγήWebDriverWait
απόσελήνιο.webdriverΤουποστήριξη εισαγωγήαναμενόμενες_ συνθήκες
επιλογές=webdriver.Επιλογές Chrome()
επιλογές.ακέφαλος = Αληθής
πρόγραμμα περιήγησης=webdriver.Χρώμιο(εκτελέσιμη_διαδρομή='./drivers/chromedriver',επιλογές=επιλογές)
πρόγραμμα περιήγησης.παίρνω('https://www.unixtimestamp.com/')
προσπαθήστε:
χρονική σήμανση=WebDriverWait(πρόγραμμα περιήγησης, 10)Τομέχρι(
αναμενόμενες_ συνθήκες.παρουσία_στοιχείου_τοποθετημένου((Με.XPATH, '
// h3 [@] [1] '
))
)
Τυπώνω('Τρέχουσα χρονική σήμανση: %s'%(χρονική σήμανση.κείμενοΤοδιαίρεση('')[0]))
τελικά:
πρόγραμμα περιήγησης.Κλείσε()

Μόλις τελειώσετε, αποθηκεύστε το ex02.py Python script.

Η γραμμή 1-5 εισάγει όλα τα απαιτούμενα στοιχεία από τη βιβλιοθήκη Selenium.

Η γραμμή 7 δημιουργεί ένα αντικείμενο Επιλογές Chrome.

Η γραμμή 8 ενεργοποιεί τη λειτουργία χωρίς κεφαλή για το πρόγραμμα οδήγησης ιστού Chrome.

Η γραμμή 10 δημιουργεί ένα αντικείμενο του προγράμματος περιήγησης Chrome χρησιμοποιώντας το chromedriver δυαδικό από το οδηγοί/ Ευρετήριο.

Η γραμμή 12 φορτώνει το www.unixtimestamp.com στο πρόγραμμα περιήγησης.

Η ρητή αναμονή υλοποιείται στο μπλοκ δοκιμαστικής δοκιμής (από τη γραμμή 14-20)

Η γραμμή 15-17 χρησιμοποιεί δημιουργεί WebDriverWait () αντικείμενο. Το πρώτο επιχείρημα του WebDriverWait () είναι το αντικείμενο του προγράμματος περιήγησης και το δεύτερο όρισμα είναι ο μέγιστος επιτρεπόμενος χρόνος (το χειρότερο σενάριο) για την εκπλήρωση της συνθήκης, που είναι 10 δευτερόλεπτα σε αυτήν την περίπτωση.

Στο μέχρι() ΟΙΚΟΔΟΜΙΚΟ ΤΕΤΡΑΓΩΝΟ, αναμενόμενες_ συνθήκες.presence_of_element_located () η μέθοδος χρησιμοποιείται για να βεβαιωθείτε ότι το στοιχείο είναι παρόν πριν επιχειρήσετε να επιλέξετε το στοιχείο. Εδώ, By.XPATH χρησιμοποιείται για να πει το παρουσία_στοιχείου_τοποθετημένο () μέθοδο που χρησιμοποιήσαμε έναν επιλογέα XPath για την επιλογή του στοιχείου. Ο επιλογέας XPath είναι // h3 [@class = ’text-risk’] [1] Το

Μόλις βρεθεί το στοιχείο, αποθηκεύεται στο χρονική σήμανση μεταβλητός.

Η γραμμή 18 εκτυπώνει μόνο τη χρονική σήμανση από το επιλεγμένο στοιχείο.

Τέλος, η γραμμή 19-20 κλείνει το πρόγραμμα περιήγησης.

Μόλις τελειώσετε, τρέξτε το ex02.py Το σενάριο Python ως εξής:

$ python3 ex02.py

Όπως μπορείτε να δείτε, η τρέχουσα χρονική σήμανση από το unixtimestamp.com είναι τυπωμένη στην κονσόλα.

Επιλογή στοιχείων σε ρητή αναμονή:

Στην προηγούμενη ενότητα, χρησιμοποίησα By.XPATH για την επιλογή του στοιχείου χρησιμοποιώντας τον επιλογέα XPath. Μπορείτε επίσης να επιλέξετε τα στοιχεία χρησιμοποιώντας αναγνωριστικό, όνομα ετικέτας, όνομα κλάσης CSS, επιλογέα CSS κ.λπ.

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

By.XPATH - Επιλέγει στοιχείο/στοιχεία χρησιμοποιώντας τον επιλογέα XPath.

By.CLASS_NAME - Επιλέγει στοιχείο/στοιχεία χρησιμοποιώντας όνομα κλάσης CSS.

Από.CSS_SELECTOR - Επιλέγει στοιχείο/στοιχεία χρησιμοποιώντας τον επιλογέα CSS.

By.ID - Επιλέγει στοιχείο ανά αναγνωριστικό

Από όνομα - Επιλέγει στοιχείο/στοιχεία κατά όνομα.

Από.TAG_NAME - Επιλέγει στοιχείο/στοιχεία κατά όνομα ετικέτας HTML.

Από.LINK_TEXT - Επιλέγει στοιχείο/στοιχεία με κείμενο συνδέσμου του προς το (άγκυρα) ετικέτα HTML.

Από.PARTIAL_LINK_TEXT - Επιλέγει στοιχείο/στοιχεία με μερική σύνδεση κειμένου του προς το (άγκυρα) ετικέτα HTML.

Για περισσότερες πληροφορίες σχετικά με αυτά, επισκεφθείτε τη διεύθυνση Σελίδα τεκμηρίωσης Python Selenium API Το

Αναμενόμενες συνθήκες σε ρητή αναμονή:

Στο προηγούμενο ρητό παράδειγμα αναμονής, χρησιμοποίησα το παρουσία_στοιχείου_τοποθετημένο () μέθοδος για αναμενόμενες_ συνθήκες ως ρητή συνθήκη αναμονής για να βεβαιωθείτε ότι το στοιχείο που έψαχνα υπάρχει πριν το επιλέξετε.

Υπάρχουν και άλλα αναμενόμενες_ συνθήκες μπορείτε να χρησιμοποιήσετε ως ρητή συνθήκη αναμονής. Κάποιοι από αυτούς είναι:

title_is (τίτλος) - ελέγχει αν ο τίτλος της σελίδας είναι τίτλος Το

title_contains (μερικός_τιτλος) - ελέγχει εάν ο τίτλος της σελίδας περιέχει μέρος του τίτλου partial_title Το

visibility_of (στοιχείο) - ελέγχει αν το στοιχείο είναι ορατό στη σελίδα που είναι το στοιχείο έχει πλάτος και ύψος μεγαλύτερο από 0.

visibility_of_element_located (εντοπιστής) -

παρουσία_στοιχείου_τοποθετημένο (εντοπιστής) - Βεβαιωθείτε ότι το στοιχείο βρίσκεται (από το τοποθετών ) υπάρχει στη σελίδα. ο τοποθετών είναι μια πλειάδα από (Από, επιλογέα), όπως έχω δείξει στο ρητό παράδειγμα αναμονής.

παρουσία_όλων_στο_στοιχείο_ (τοποθετημένο) - Βεβαιώνεται ότι όλα τα στοιχεία ταιριάζουν με το τοποθετών υπάρχει στη σελίδα. ο τοποθετών είναι ένα (Από, επιλογέα) πλειάδα

text_to_be_present_in_element (εντοπιστής, κείμενο) - Ελέγχει αν το κείμενο υπάρχει στο στοιχείο που βρίσκεται από το τοποθετών Το ο τοποθετών είναι ένα (Από, επιλογέα) πλειάδα

element_to_be_clickable (εντοπιστής) - Ελέγχει εάν το στοιχείο βρίσκεται από το τοποθετών είναι ορατό και κλικ. ο τοποθετών είναι ένα (Από, επιλογέα) πλειάδα

element_to_be_selected (εντοπιστής) - Ελέγχει εάν το στοιχείο βρίσκεται από το τοποθετών είναι επιλεγμένο. ο τοποθετών είναι ένα (Από, επιλογέα) πλειάδα

alert_is_present () - περιμένετε να υπάρχει ένα παράθυρο διαλόγου ειδοποίησης στη σελίδα.

Υπάρχουν πολλά ακόμη αναμενόμενες_ συνθήκες διαθέσιμο για χρήση από εσάς. Για περισσότερες πληροφορίες σχετικά με αυτά, επισκεφθείτε τη διεύθυνση Σελίδα τεκμηρίωσης Python Selenium API Το

Συμπέρασμα:

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

Για περισσότερες πληροφορίες σχετικά με το Selenium αναμονής, επισκεφθείτε η επίσημη βιβλιοθήκη Selenium Python περιμένει τη σελίδα τεκμηρίωσης Το