Πώς να χειριστείτε τις κλήσεις AJAX Selenium Πρόγραμμα οδήγησης Web

⚡ Έξυπνη Σύνοψη

Το AJAX καλεί την ενημέρωση ενός μέρους μιας σελίδας χωρίς επαναφόρτωση, επομένως Selenium Το WebDriver πρέπει να περιμένει το νέο περιεχόμενο αντί να υποθέτει ότι υπάρχει, και η στρατηγική αναμονής αποφασίζει εάν η δοκιμή θα περάσει με αξιοπιστία.

  • 🔘 Ορισμός: Το AJAX ανακτά μικρές ποσότητες δεδομένων ασύγχρονα και ανανεώνει μόνο ένα μέρος της σελίδας.
  • ☑️ Βασικό πρόβλημα: Ο χρόνος απόκρισης του διακομιστή είναι άγνωστος, επομένως το στοιχείο ενδέχεται να μην υπάρχει κατά την αναζήτηση του WebDriver.
  • ✅ Επιλογές αναμονής: Τα Thread.sleep, implicit wait, explicit wait, WebDriverWait και FluentWait συμπεριφέρονται διαφορετικά.
  • 🧪 Συνιστάται: Το WebDriverWait με μια ExpectedCondition polles μέχρι να εμφανιστεί το αποτέλεσμα AJAX και στη συνέχεια συνεχίζει αμέσως.
  • ️ FluentWait: Προσθέτει ένα διάστημα σταθμοσκόπησης και μπορεί να αγνοήσει επιλεγμένες εξαιρέσεις μεταξύ των προσπαθειών.
  • ⚠️ Selenium 4: Τα χρονικά όρια πλέον απαιτούν Διάρκεια, και Selenium Ο διαχειριστής καταργεί τη διαδρομή του μη αυτόματου προγράμματος οδήγησης.

Πώς να χειρίζεστε κλήσεις AJAX σε Selenium Πρόγραμμα οδήγησης Web

Τι είναι το AJAX;

Το AJAX σημαίνει Asynchronous JavaScript & XML, και επιτρέπει στην ιστοσελίδα να ανακτά μικρές ποσότητες δεδομένων από τον διακομιστή χωρίς να επαναφορτώσει ολόκληρη τη σελίδα.

Το AJAX είναι μια τεχνική για τη δημιουργία γρήγορων, δυναμικών ιστοσελίδων. Είναι ασύγχρονο, συνδυάζει JavaΓραφή με μορφή δεδομένων και ενημερώνει μέρη μιας σελίδας αντί για ολόκληρη τη σελίδα. Gmail, Google Χάρτες, Facebook και YouTube όλοι το χρησιμοποιούν.

Πώς λειτουργεί το AJAX;

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

Διάγραμμα μιας κλήσης AJAX μεταξύ προγράμματος περιήγησης και διακομιστή χωρίς πλήρη επαναφόρτωση σελίδας

  • Μια κλήση 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.

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

Όχι. Οι κατασκευαστές int και long αφαιρέθηκαν. Μεταβιβάστε την Duration.ofSeconds(5) αντί αυτού και χρησιμοποιήστε την Duration για implicitlyWait, pageLoadTimeout και κάθε ρύθμιση FluentWait.

Χρησιμοποιήστε το ExpectedConditions.invisibilityOfElementLocated με τον εντοπιστή περιστροφής. Η αναμονή μόνο του στοιχείου-στόχου συχνά περνάει πολύ νωρίς, ενώ η επικάλυψη εξακολουθεί να εμποδίζει το κλικ.

Εκτελέστε το σενάριο που επιστρέφει την τιμή jQuery.active == 0 μέσα σε ένα μπλοκ αναμονής. Αναφέρει μηδέν μόνο όταν δεν υπάρχει ακόμα ανοιχτό αίτημα jQuery.

Η απόκριση AJAX αντικατέστησε τον κόμβο DOM στον οποίο υποδείκνυε το WebElement σας. Εντοπίστε ξανά το στοιχείο μετά την αναμονή αντί να χρησιμοποιήσετε ξανά την προηγούμενη αναφορά.

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

Ναί. GitHub Copilot Προσαρμόζει τα μπλοκ WebDriverWait και FluentWait από ένα σχόλιο, αλλά επιβεβαιώνει ότι η ExpectedCondition ταιριάζει με την πραγματική συμπεριφορά της σελίδας.

Όχι. Selenium Η τεκμηρίωση προειδοποιεί ότι η ανάμειξή τους προκαλεί απρόβλεπτα χρονικά όρια. Διατηρήστε την έμμεση αναμονή στο μηδέν και βασιστείτε σε ρητές αναμονές.

Όχι από τότε Selenium 4.6. Selenium Ο διαχειριστής κατεβάζει και ρυθμίζει ένα αντίστοιχο πρόγραμμα οδήγησης, επομένως η γραμμή χρειάζεται μόνο για να καρφιτσώσει ένα τοπικό δυαδικό αρχείο προγράμματος οδήγησης.

Συνοψίστε αυτήν την ανάρτηση με: