Σιωπηρή, ρητή, & Άπταιστα περιμένετε στο Selenium WebDriver

Πίνακας περιεχομένων:

Anonim

Στο Σελήνιο, το "Waits" παίζει σημαντικό ρόλο στην εκτέλεση δοκιμών. Σε αυτό το σεμινάριο, θα μάθετε διάφορες πτυχές τόσο του "Implicit" όσο και του "Explicit" περιμένει στο Selenium.

Σε αυτό το σεμινάριο, θα μάθετε:

  • Γιατί χρειαζόμαστε αναμονές στο σελήνιο;
  • Σιωπηρή αναμονή
  • Άμεση αναμονή
  • Άπταιστα περιμένετε

Γιατί χρειαζόμαστε αναμονές στο σελήνιο;

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

Όχι μόνο αυτό καθιστά δύσκολο τον προσδιορισμό του στοιχείου, αλλά και εάν το στοιχείο δεν βρίσκεται, θα ρίξει μια εξαίρεση " ElementNotVisibleException ". Χρησιμοποιώντας το Selenium Waits, μπορούμε να επιλύσουμε αυτό το πρόβλημα.

Ας εξετάσουμε ένα σενάριο όπου πρέπει να χρησιμοποιήσουμε τόσο σιωπηρές όσο και ρητές αναμονές στη δοκιμή μας. Ας υποθέσουμε ότι ο σιωπηρός χρόνος αναμονής έχει οριστεί σε 20 δευτερόλεπτα και ο ρητός χρόνος αναμονής έχει οριστεί σε 10 δευτερόλεπτα.

Ας υποθέσουμε ότι προσπαθούμε να βρούμε ένα στοιχείο που έχει κάποιες "ExpectedConditions " (Explicit Wait), Εάν το στοιχείο δεν βρίσκεται εντός του χρονικού πλαισίου που ορίζεται από την Explicit αναμονή (10 δευτερόλεπτα), θα χρησιμοποιήσει το χρονικό πλαίσιο που ορίζεται από τη σιωπηρή αναμονή ( 20 δευτερόλεπτα) πριν ρίξετε ένα " ElementNotVisibleException ".

Το πρόγραμμα οδήγησης ιστού Selenium περιμένει

  1. Σιωπηρή αναμονή
  2. Άμεση αναμονή

Σιωπηρή αναμονή στο σελήνιο

Το Implicit Wait in Selenium χρησιμοποιείται για να πει στο πρόγραμμα οδήγησης ιστού να περιμένει ένα συγκεκριμένο χρονικό διάστημα προτού ρίξει μια «Εξαίρεση χωρίς τέτοιο στοιχείο». Η προεπιλεγμένη ρύθμιση είναι 0. Μόλις ορίσουμε την ώρα, το πρόγραμμα οδήγησης ιστού θα περιμένει το στοιχείο για εκείνη την ώρα προτού ρίξει μια εξαίρεση.

Το Selenium Web Driver δανείστηκε την ιδέα των σιωπηρών αναμονών από τον Watir.

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

Για να δηλώσετε την σιωπηρή αναμονή:

Σύνταξη :

driver.manage (). timeouts (). implicitlyWait (TimeOut, TimeUnit.SECONDS); 
πακέτο guru.test99;εισαγωγή java.util.concurrent.TimeUnit;εισαγωγή org.openqa.selenium.By;εισαγωγή org.openqa.selenium.WebDriver;εισαγωγή org.openqa.selenium.chrome.ChromeDriver;εισαγωγή org.testng.annotations.Test;δημόσια τάξη AppTest {προστατευμένο πρόγραμμα οδήγησης WebDriver.@Δοκιμήpublic void guru99tutorials () ρίχνει το InterruptException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");πρόγραμμα οδήγησης = νέο ChromeDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);String eTitle = "Demo Guru99 Σελίδα";Συμβολοσειρά aTitle = "";// εκκινήστε το Chrome και ανακατευθύνετέ το στη βασική διεύθυνση URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Μεγιστοποιεί το παράθυρο του προγράμματος περιήγησηςdriver.manage (). window (). μεγιστοποίηση ();// λάβετε την πραγματική αξία του τίτλουaTitle = driver.getTitle ();// συγκρίνετε τον πραγματικό τίτλο με τον αναμενόμενο τίτλοεάν (aTitle.equals (eTitle)){System.out.println ("Η δοκιμή πέρασε");}αλλιώς {System.out.println ("Η δοκιμή απέτυχε");}// κλείσιμο προγράμματος περιήγησηςdriver.close ();}}

Επεξήγηση του κώδικα

Στο παραπάνω παράδειγμα,

Εξετάστε τον ακόλουθο κώδικα:

driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);

Η σιωπηρή αναμονή θα δεχτεί 2 παραμέτρους, η πρώτη παράμετρος θα δεχτεί τον χρόνο ως ακέραια τιμή και η δεύτερη παράμετρος θα δεχτεί τη μέτρηση χρόνου σε όρους SECONDS, MINUTES, MILISECOND, MICROSECONDS, NANOSECONDS, DAYS, HOURS κ.λπ.

Περιμένετε στο Σελήνιο

Το Explicit Wait in Selenium χρησιμοποιείται για να πει στο πρόγραμμα οδήγησης ιστού να περιμένει συγκεκριμένες συνθήκες (αναμενόμενες συνθήκες) ή να υπερβεί το μέγιστο χρόνο προτού ρίξει την εξαίρεση "ElementNotVisibleException". Είναι ένα έξυπνο είδος αναμονής, αλλά μπορεί να εφαρμοστεί μόνο για συγκεκριμένα στοιχεία. Δίνει καλύτερες επιλογές από την σιωπηρή αναμονή, καθώς περιμένει δυναμικά φορτωμένα στοιχεία Ajax.

Μόλις δηλώσουμε ρητή αναμονή, πρέπει να χρησιμοποιήσουμε το " ExpectedConditions " ή μπορούμε να διαμορφώσουμε πόσο συχνά θέλουμε να ελέγξουμε την κατάσταση χρησιμοποιώντας το Fluent Wait . Αυτές τις μέρες κατά την εφαρμογή χρησιμοποιούμε το Thread.Sleep () γενικά δεν συνιστάται η χρήση

Στο παρακάτω παράδειγμα, δημιουργούμε αναμονή αναφοράς για την κλάση " WebDriverWait " και δημιουργούμε την αναφορά χρησιμοποιώντας την αναφορά " WebDriver " και δίνουμε μέγιστο χρονικό διάστημα 20 δευτερολέπτων.

Σύνταξη:

WebDriverWait wait = νέο WebDriverWait (WebDriverRefrence, TimeOut);
πακέτο guru.test99;εισαγωγή java.util.concurrent.TimeUnit;εισαγωγή org.openqa.selenium.By;εισαγωγή org.openqa.selenium.WebDriver;εισαγωγή org.openqa.selenium.WebElement;εισαγωγή org.openqa.selenium.chrome.ChromeDriver;εισαγωγή org.openqa.selenium.support.ui.ExpectedConditions;εισαγωγή org.openqa.selenium.support.ui.WebDriverWait;εισαγωγή org.testng.annotations.Test;δημόσια τάξη AppTest2 {προστατευμένο πρόγραμμα οδήγησης WebDriver.@Δοκιμήpublic void guru99tutorials () ρίχνει το InterruptException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");πρόγραμμα οδήγησης = νέο ChromeDriver ();WebDriverWait wait = νέο WebDriverWait (πρόγραμμα οδήγησης, 20);String eTitle = "Demo Guru99 Σελίδα";Συμβολοσειρά aTitle = "";// εκκινήστε το Chrome και ανακατευθύνετέ το στη βασική διεύθυνση URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Μεγιστοποιεί το παράθυρο του προγράμματος περιήγησηςdriver.manage (). window (). μεγιστοποίηση ();// λάβετε την πραγματική αξία του τίτλουaTitle = driver.getTitle ();// συγκρίνετε τον πραγματικό τίτλο με τον αναμενόμενο τίτλοεάν (aTitle.contentEquals (eTitle)){System.out.println ("Η δοκιμή πέρασε");}αλλιώς {System.out.println ("Η δοκιμή απέτυχε");}WebElement γκουρού99seleniumlink;guru99seleniumlink = wait.until (ExpectedConditions.visibilityOfElementLocated (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2] / div [2] / div / div / div / div / div [1] / div / div / a / i ")));guru99seleniumlink.click ();}}

Επεξήγηση του κώδικα

Εξετάστε τον ακόλουθο κώδικα:

WebElement γκουρού99seleniumlink;guru99seleniumlink = wait.until (ExpectedConditions.visibilityOfElementLocated (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2] / div [2] / div / div / div / div / div [1] / div / div / a / i ")));guru99seleniumlink.click ();

Σε αυτό το παράδειγμα αναμονής WebDriver, περιμένετε για το χρονικό διάστημα που ορίζεται στην κλάση " WebDriverWait " ή " ExpectedConditions " για να συμβεί όποιο συμβεί πρώτο.

Ο παραπάνω κώδικας Java αναφέρει ότι περιμένουμε ένα στοιχείο για το χρονικό πλαίσιο των 20 δευτερολέπτων, όπως ορίζεται στην κλάση " WebDriverWait " στην ιστοσελίδα έως ότου ικανοποιηθούν οι " ExpectedConditions " και η συνθήκη είναι " visibilityofElementLocated ".

Ακολουθούν οι αναμενόμενες συνθήκες που μπορούν να χρησιμοποιηθούν στο Selenium Explicit Wait

  1. alertIsPresent ()
  2. elementSelectionStateToBe ()
  3. elementToBeClickable ()
  4. elementToBeSelected ()
  5. frameToBeAvaliableAndSwitchToIt ()
  6. invisibilityOfTheElementLocated ()
  7. invisibilityOfElementWithText ()
  8. παρουσίαOfAllElementsLocatedBy ()
  9. موجودگیOfElementLocated ()
  10. textToBePresentInElement ()
  11. textToBePresentInElementLocated ()
  12. textToBePresentInElementValue ()
  13. τίτλοςIs ()
  14. Περιέχει τίτλο ()
  15. ορατότηταOf ()
  16. visibilityOfAllElements ()
  17. visibilityOfAllElementsLocatedBy ()
  18. visibilityOfElementLocated ()

Άπταιστη αναμονή στο σελήνιο

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

Συχνότητα: Ρύθμιση ενός κύκλου επανάληψης με το χρονικό πλαίσιο για την επαλήθευση / έλεγχο της κατάστασης στο κανονικό χρονικό διάστημα

Ας εξετάσουμε ένα σενάριο όπου ένα στοιχείο φορτώνεται σε διαφορετικά χρονικά διαστήματα. Το στοιχείο μπορεί να φορτωθεί εντός 10 δευτερολέπτων, 20 δευτερολέπτων ή ακόμα περισσότερο από αυτό εάν δηλώσουμε μια σαφή αναμονή 20 δευτερολέπτων. Θα περιμένει μέχρι τον καθορισμένο χρόνο πριν ρίξει μια εξαίρεση. Σε τέτοια σενάρια, η ρευστή αναμονή είναι η ιδανική αναμονή για χρήση, καθώς αυτό θα προσπαθήσει να βρει το στοιχείο σε διαφορετική συχνότητα έως ότου το βρει ή τελειώσει ο τελικός χρονοδιακόπτης.

Σύνταξη:

Wait wait = νέο FluentWait (αναφορά WebDriver).withTimeout (χρονικό όριο, SECONDS).pollingEvery (χρονικό όριο, SECONDS).ignoring (Exception.class) ·

Ο παραπάνω κωδικός έχει καταργηθεί στο Selenium v3.11 και παραπάνω. Πρέπει να χρησιμοποιήσετε

Wait wait = νέο FluentWait (αναφορά WebDriver).withTimeout (Διάρκεια δευτερολέπτων (SECONDS)).pollingEvery (Διάρκεια. δευτερολέπτων (SECONDS)).ignoring (Exception.class) ·
πακέτο guru.test99;εισαγωγή org.testng.annotations.Test;εισαγωγή java.util.NoSuchElementException;εισαγωγή java.util.concurrent.TimeUnit;εισαγωγή java.util.function.Function;εισαγωγή org.openqa.selenium.By;εισαγωγή org.openqa.selenium.WebDriver;εισαγωγή org.openqa.selenium.WebElement;εισαγωγή org.openqa.selenium.chrome.ChromeDriver;εισαγωγή org.openqa.selenium.support.ui.ExpectedConditions;εισαγωγή org.openqa.selenium.support.ui.FluentWait;εισαγωγή org.openqa.selenium.support.ui.Wait;εισαγωγή org.openqa.selenium.support.ui.WebDriverWait;εισαγωγή org.testng.annotations.Test;δημόσια τάξη AppTest3 {προστατευμένο πρόγραμμα οδήγησης WebDriver.@Δοκιμήpublic void guru99tutorials () ρίχνει το InterruptException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");String eTitle = "Demo Guru99 Σελίδα";Συμβολοσειρά aTitle = "";πρόγραμμα οδήγησης = νέο ChromeDriver ();// εκκινήστε το Chrome και ανακατευθύνετέ το στη βασική διεύθυνση URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Μεγιστοποιεί το παράθυρο του προγράμματος περιήγησηςdriver.manage (). window (). μεγιστοποίηση ();// λάβετε την πραγματική αξία του τίτλουaTitle = driver.getTitle ();// συγκρίνετε τον πραγματικό τίτλο με τον αναμενόμενο τίτλοεάν (aTitle.contentEquals (eTitle)){System.out.println ("Η δοκιμή πέρασε");}αλλιώς {System.out.println ("Η δοκιμή απέτυχε");}Περιμένετε  wait = new FluentWait  (πρόγραμμα οδήγησης).withTimeout (30, TimeUnit.SECONDS)..pollingEvery (5, TimeUnit.SECONDS)..ignoring (NoSuchElementException.class);WebElement clickseleniumlink = wait.until (νέα συνάρτηση  () {ισχύουν δημόσια WebElement (πρόγραμμα οδήγησης WebDriver) {return driver.findElement (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2] ] / div [2] / div / div / div / div / div [1] / div / div / a / i "));}});// κάντε κλικ στον σύνδεσμο σεληνίουclickseleniumlink.click ();// κλείσιμο ~ πρόγραμμα περιήγησηςdriver.close ();}}

Επεξήγηση του κώδικα

Εξετάστε τον ακόλουθο κώδικα:

Περιμένετε  wait = new FluentWait  (πρόγραμμα οδήγησης).withTimeout (30, TimeUnit.SECONDS)..pollingEvery (5, TimeUnit.SECONDS)..ignoring (NoSuchElementException.class);

Στο παραπάνω παράδειγμα, δηλώνουμε άπταιστη αναμονή με χρονικό όριο 30 δευτερολέπτων και η συχνότητα ορίζεται σε 5 δευτερόλεπτα αγνοώντας το " NoSuchElementException "

Εξετάστε τον ακόλουθο κώδικα:

ισχύουν δημόσια WebElement (πρόγραμμα οδήγησης WebDriver) {return driver.findElement (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2] ] / div [2] / div / div / div / div / div [1] / div / div / a / i ")); 

Έχουμε δημιουργήσει μια νέα λειτουργία για την αναγνώριση του Στοιχείου Ιστού στη σελίδα. (Π.χ .: Εδώ το Web Element δεν είναι τίποτα άλλο από το σύνδεσμο Selenium στην ιστοσελίδα).

Η συχνότητα ορίζεται στα 5 δευτερόλεπτα και ο μέγιστος χρόνος ορίζεται στα 30 δευτερόλεπτα. Αυτό σημαίνει ότι θα ελέγχει για το στοιχείο στην ιστοσελίδα κάθε 5 δευτερόλεπτα για το μέγιστο χρόνο των 30 δευτερολέπτων. Εάν το στοιχείο βρίσκεται μέσα σε αυτό το χρονικό πλαίσιο, θα εκτελέσει τις λειτουργίες αλλιώς θα ρίξει ένα " ElementNotVisibleException "

Διαφορά μεταξύ της έμμεσης αναμονής έναντι της ρητής αναμονής

Σιωπηρή αναμονή Άμεση αναμονή
  • Ο έμμεσος χρόνος αναμονής εφαρμόζεται σε όλα τα στοιχεία του σεναρίου
  • Ο ρητός χρόνος αναμονής εφαρμόζεται μόνο σε εκείνα τα στοιχεία που προορίζονται από εμάς
  • Στο Implicit Wait, δεν χρειάζεται να καθορίσουμε "ExpectedConditions" στο στοιχείο που θα εντοπιστεί
  • Στο Explicit Wait, πρέπει να καθορίσουμε "ExpectedConditions" στο στοιχείο που θα εντοπιστεί
  • Συνιστάται να χρησιμοποιείται όταν τα στοιχεία βρίσκονται με το χρονικό πλαίσιο που καθορίζεται στο Selenium έμμεση αναμονή
  • Συνιστάται να χρησιμοποιείται όταν τα στοιχεία χρειάζονται πολύ χρόνο για φόρτωση και επίσης για την επαλήθευση της ιδιότητας του στοιχείου όπως (visibilityOfElementLocated, elementToBeClickable, elementToBeSelected)

Συμπέρασμα:

Το Implicit, Explicit and Fluent Wait είναι οι διαφορετικές αναμονές που χρησιμοποιούνται στο Σελήνιο. Η χρήση αυτών των αναμονών βασίζεται πλήρως στα στοιχεία που φορτώνονται σε διαφορετικά χρονικά διαστήματα. Δεν συνιστάται πάντα η χρήση του Thread.Sleep () κατά τη δοκιμή της εφαρμογής μας ή τη δημιουργία του πλαισίου μας.

Αυτό το άρθρο συνεισφέρει ο Chaitanya Pujari