Πώς να χειριστείτε τις κλήσεις AJAX Selenium Πρόγραμμα οδήγησης Web
⚡ Έξυπνη Σύνοψη
Το AJAX καλεί την ενημέρωση ενός μέρους μιας σελίδας χωρίς επαναφόρτωση, επομένως Selenium Το WebDriver πρέπει να περιμένει το νέο περιεχόμενο αντί να υποθέτει ότι υπάρχει, και η στρατηγική αναμονής αποφασίζει εάν η δοκιμή θα περάσει με αξιοπιστία.
Τι είναι το AJAX;
Το AJAX σημαίνει Asynchronous JavaScript & XML, και επιτρέπει στην ιστοσελίδα να ανακτά μικρές ποσότητες δεδομένων από τον διακομιστή χωρίς να επαναφορτώσει ολόκληρη τη σελίδα.
Το AJAX είναι μια τεχνική για τη δημιουργία γρήγορων, δυναμικών ιστοσελίδων. Είναι ασύγχρονο, συνδυάζει JavaΓραφή με μορφή δεδομένων και ενημερώνει μέρη μιας σελίδας αντί για ολόκληρη τη σελίδα. Gmail, Google Χάρτες, Facebook και YouTube όλοι το χρησιμοποιούν.
Πώς λειτουργεί το AJAX;
Για παράδειγμα, όταν κάνετε κλικ σε ένα κουμπί υποβολής, JavaΤο σενάριο στέλνει ένα αίτημα στον διακομιστή, ερμηνεύει το αποτέλεσμα και ενημερώνει την τρέχουσα οθόνη χωρίς επαναφόρτωση. Το παρακάτω διάγραμμα δείχνει αυτήν την ανταλλαγή.
- Μια κλήση AJAX είναι ένα ασύγχρονο αίτημα από το πρόγραμμα περιήγησης που δεν προκαλεί μετάβαση σελίδας. Ο χρήστης μπορεί να συνεχίσει να εργάζεται στην εφαρμογή όσο το αίτημα περιμένει μια απάντηση.
- Το AJAX στέλνει αιτήματα HTTP στον διακομιστή και επεξεργάζεται την απόκριση χωρίς να φορτώσει ξανά τη σελίδα, επομένως δεν μπορείτε να προβλέψετε πόσο χρόνο θα χρειαστεί ο διακομιστής για να απαντήσει.
Από την οπτική γωνία ενός δοκιμαστή, ο έλεγχος περιεχομένου ή ενός στοιχείου σημαίνει αναμονή μέχρι να φτάσει η απόκριση. Το ωφέλιμο φορτίο ήταν αρχικά XML, όπως υποδηλώνει και το όνομα. Τα περισσότερα API επιστρέφουν πλέον JSON.
Πώς να χειριστείτε τις κλήσεις AJAX Selenium Πρόγραμμα οδήγησης Web
Η μεγαλύτερη πρόκληση στη διαχείριση μιας κλήσης AJAX είναι η γνώση του χρόνου φόρτωσης. Επειδή η ενημέρωση διαρκεί ένα κλάσμα του δευτερολέπτου, η εφαρμογή είναι δύσκολο να δοκιμαστεί μέσω ενός εργαλείου αυτοματισμού, επομένως Selenium Το WebDriver πρέπει να εφαρμόσει μια μέθοδο αναμονής στην κλήση.
Η εκτέλεση αυτής της εντολής αναμονής αναστέλλει την τρέχουσα Δοκιμαστική θήκη μέχρι να εμφανιστεί η αναμενόμενη ή η νέα τιμή· Selenium Στη συνέχεια, το WebDriver συνεχίζει τα βήματα που έχουν ανασταλεί.
Ακολουθούν οι μέθοδοι αναμονής που Selenium Το WebDriver μπορεί να χρησιμοποιήσει
Thread.sleep()
- Η συνάρτηση Thread.sleep () δεν είναι μια σοφή επιλογή, καθώς αναστέλλει το τρέχον νήμα για το καθορισμένο χρονικό διάστημα.
- Στο AJAX δεν μπορείτε ποτέ να είστε σίγουροι για τον ακριβή χρόνο αναμονής, επομένως η δοκιμή αποτυγχάνει εάν το στοιχείο δεν εμφανίζεται μέσα σε αυτήν. Προσθέτει επίσης επιβάρυνση, επειδή το Thread.sleep(t) μετακινεί το τρέχον νήμα από την ουρά που εκτελείται στην ουρά αναμονής.
- Μετά τον χρόνο 't', το νήμα μετακινείται στην ουρά ετοιμότητας και στη συνέχεια περιμένει ξανά να αναληφθεί από την CPU.
Σημείωση: ο Java η μέθοδος είναι Thread.sleep() σε πεζά γράμματα· η κεφαλαία μορφή δεν μεταγλωττίζεται.
Σιωπηρή αναμονή ()
- Αυτή η μέθοδος λέει στο WebDriver να περιμένει όταν ένα στοιχείο δεν είναι άμεσα διαθέσιμο και η ρύθμιση παραμένει σε ισχύ για ολόκληρη την περίοδο λειτουργίας του προγράμματος περιήγησης. Επομένως, κάθε αναζήτηση στοιχείου μπορεί να διαρκέσει όσο χρόνο επιτρέπει η έμμεση αναμονή.
Ρητή αναμονή ()
- Ρητή αναμονή χρησιμοποιείται για να παγώσει την εκτέλεση της δοκιμής μέχρι τη στιγμή που πληρούται μια συγκεκριμένη συνθήκη ή μέχρι να παρέλθει το μέγιστο χρονικό διάστημα.
WebDriverΠεριμένετε
- Μπορεί να χρησιμοποιηθεί για οποιαδήποτε συνθήκη, συνδυάζοντας το WebDriverWait με μια ExpectedCondition.
- Η καλύτερη προσέγγιση είναι να ελέγχετε τη συνθήκη κάθε δευτερόλεπτο και να προχωράτε στην επόμενη εντολή μόλις αυτή ικανοποιηθεί.
Αλλά το πρόβλημα με όλες αυτές τις αναμονές είναι ότι πρέπει να αναφέρετε τη μονάδα χρόνου λήξης. Τι γίνεται αν το στοιχείο δεν είναι ακόμα παρόν εντός του χρόνου; Υπάρχει λοιπόν μια ακόμη αναμονή που ονομάζεται Fluent wait.
Γρήγορη αναμονή
- Αυτή είναι μια υλοποίηση της διεπαφής Wait με το δικό της χρονικό όριο και διάστημα polling. Κάθε παρουσία FluentWait ορίζει τον μέγιστο χρόνο αναμονής για μια συνθήκη και τη συχνότητα ελέγχου της.
Προκλήσεις στη διαχείριση κλήσεων AJAX Selenium Πρόγραμμα οδήγησης Web
- Η χρήση της εντολής «παύση» δεν είναι αξιόπιστη. Μια μεγάλη παύση κάνει τη δοκιμή απαράδεκτα αργή και αυξάνει Δοκιμές χρόνο, επομένως προτάθηκε η επιλογή "waitforcondition" για εφαρμογές AJAX.
- Είναι δύσκολο να εκτιμηθεί ο κίνδυνος που σχετίζεται με συγκεκριμένες εφαρμογές AJAX.
- Η παροχή πλήρους ελευθερίας στους προγραμματιστές να τροποποιήσουν μια εφαρμογή AJAX καθιστά τη διαδικασία δοκιμών δύσκολη.
- Η δημιουργία ενός αυτοματοποιημένου αιτήματος δοκιμής μπορεί να είναι δύσκολη για τα εργαλεία δοκιμών, επειδή οι εφαρμογές AJAX συχνά χρησιμοποιούν διαφορετική τεχνική κωδικοποίησης ή σειριοποίησης για την υποβολή δεδομένων POST.
Σημείωση: Οι «παύση» και «αναμονή για συνθήκη» είναι Σεληνέζικα εντολές που αφαιρέθηκαν στο Selenium 3. το ισοδύναμο του WebDriver είναι μια ρητή αναμονή.
Code Παράδειγμα για χειρισμό AJAX χρησιμοποιώντας Selenium Πρόγραμμα οδήγησης Web
The TestNG Η παρακάτω κλάση διαβάζει το κείμενο, κάνει κλικ στο κουμπί επιλογής, περιμένει την απόκριση AJAX και βεβαιώνει ότι το κείμενο άλλαξε.
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class Ajaxdemo { private String URL = "https://demo.guru99.com/test/ajax.html"; WebDriver driver; WebDriverWait wait; @BeforeClass public void setUp() { System.setProperty("webdriver.chrome.driver",".\\chromedriver.exe"); //create chrome instance driver = new ChromeDriver(); driver.manage().window().maximize(); driver.navigate().to(URL); } @Test public void test_AjaxExample() { By container = By.cssSelector(".container"); wait = new WebDriverWait(driver, 5); wait.until(ExpectedConditions.presenceOfElementLocated(container)); //Get the text before performing an ajax call WebElement noTextElement = driver.findElement(By.className("radiobutton")); String textBefore = noTextElement.getText().trim(); //Click on the radio button driver.findElement(By.id("yes")).click(); //Click on Check Button driver.findElement(By.id("buttoncheck")).click(); /*Get the text after ajax call*/ WebElement TextElement = driver.findElement(By.className("radiobutton")); wait.until(ExpectedConditions.visibilityOf(TextElement)); String textAfter = TextElement.getText().trim(); /*Verify both texts before ajax call and after ajax call text.*/ Assert.assertNotEquals(textBefore, textAfter); System.out.println("Ajax Call Performed"); String expectedText = "Radio button is checked and it's value is Yes"; /*Verify expected text with text updated after ajax call*/ Assert.assertEquals(textAfter, expectedText); driver.close(); } }
Σημείωση: on Selenium 4 πέρασμα Διάρκεια Δευτερολέπτων (5) στο WebDriverWait και αποβάλετε τη γραμμή System.setProperty, επειδή Selenium Ο διαχειριστής επιλύει το πρόβλημα του chromedriver.

