So verarbeiten Sie AJAX-Aufrufe in Selenium Webtreiber
Was ist Ajax?
AJAX steht fรผr asynchrone JavaSkript und XML, und es ermรถglicht der Webseite, kleine Datenmengen vom Server abzurufen, ohne die gesamte Seite neu laden zu mรผssen.
Ajax ist eine Technik zum Erstellen schneller und dynamischer Webseiten. Diese Technik ist asynchron und verwendet eine Kombination aus Javascript und XML. Es aktualisiert die Teile einer Webseite, ohne die ganze Seite neu zu laden. Einige der bekanntesten Anwendungen, die die AJAX-Technik verwenden, sind Gmail, Google Maps, Facebook, YouTube usw.
Wie funktioniert Ajax?
Wenn Sie beispielsweise auf die Schaltflรคche โSendenโ klicken, JavaSkript stellt eine Anfrage an den Server, interpretiert das Ergebnis und aktualisiert den aktuellen Bildschirm, ohne die Webseite neu zu laden.
- Ein Ajax-Aufruf ist eine vom Browser initiierte asynchrone Anfrage, die nicht direkt zu einem Seitenwechsel fรผhrt. Das heiรt, wenn Sie eine Ajax-Anfrage auslรถsen, kann der Benutzer weiterhin an der Anwendung arbeiten, wรคhrend die Anfrage auf eine Antwort wartet.
- AJAX sendet HTTP-Anfragen vom Client an den Server und verarbeitet dann die Antwort des Servers, ohne die gesamte Seite neu zu laden. Wenn Sie also einen AJAX-Anruf tรคtigen, werden Sie Ich bin mir nicht ganz sicher, wie lange es dauert, bis der Server Ihnen eine Antwort sendet.
Aus der Sicht eines Testers mรผssen Sie warten, bis Sie die Antwort erhalten, wenn Sie den Inhalt oder das anzuzeigende Element prรผfen. Wรคhrend des AJAX-Aufrufs werden die Daten im XML-Format gespeichert und vom Server abgerufen.
So verarbeiten Sie Ajax-Aufrufe Selenium Webtreiber
Die Die grรถรte Herausforderung bei der Handhabung von Ajax-Aufrufen besteht darin, die Ladezeit der Webseite zu kennen. Da das Laden der Webseite nur Bruchteile von Sekunden dauert, ist es fรผr den Tester schwierig, eine solche Anwendung mithilfe eines Automatisierungstools zu testen. Dafรผr, Selenium Webdriver muss bei diesem Ajax-Aufruf die Wartemethode verwenden.
Durch die Ausfรผhrung dieses Wartebefehls unterbricht Selenium die Ausfรผhrung des aktuellen Testfall und warten Sie auf den erwarteten oder neuen Wert. Wenn der neue Wert oder das neue Feld angezeigt wird, werden die angehaltenen Testfรคlle ausgefรผhrt Selenium Webtreiber.
Im Folgenden sind die Wartemethoden aufgefรผhrt, die Selenium Webdriver kann verwendet werden
Thread.Sleep()
- Thread.Sleep() ist keine kluge Wahl, da es den aktuellen Thread fรผr die angegebene Zeit anhรคlt.
- In AJAX kรถnnen Sie nie sicher sein, wie lange die Wartezeit genau ist. Ihr Test schlรคgt also fehl, wenn das Element nicht innerhalb der Wartezeit angezeigt wird. Darรผber hinaus erhรถht es den Overhead, da der Aufruf von Thread.sleep(t) dazu fรผhrt, dass der aktuelle Thread von der laufenden Warteschlange in die Warteschlange verschoben wird.
- Nach Erreichen der Zeit โtโ wird der aktuelle Thread von der Warteschlange in die Bereitschaftswarteschlange verschoben und es dauert dann einige Zeit, bis er von der CPU ausgewรคhlt und ausgefรผhrt wird.
Implizites Wait()
- Diese Methode weist Webdriver an, zu warten, wenn das Element nicht sofort verfรผgbar ist. Diese Wartezeit bleibt jedoch fรผr die gesamte Zeit bestehen, in der der Browser geรถffnet ist. Daher kann jede Suche nach den Elementen auf der Seite die implizite Wartezeit in Anspruch nehmen.
Explizites Wait()
- Explizites Warten wird verwendet, um die Testausfรผhrung einzufrieren, bis eine bestimmte Bedingung erfรผllt ist oder die maximale Zeit verstrichen ist.
WebdriverWarten
- Es kann fรผr alle Bedingungen verwendet werden. Dies kann mit WebDriverWait in Kombination mit ExpectedCondition erreicht werden
- Der beste Weg, dynamisch auf ein Element zu warten, besteht darin, jede Sekunde auf die Bedingung zu prรผfen und mit dem nรคchsten Befehl im Skript fortzufahren, sobald die Bedingung erfรผllt ist.
Aber das Problem bei all diesen Wartezeiten ist, dass man die Zeitรผberschreitungseinheit erwรคhnen muss. Was ist, wenn das Element innerhalb der Zeit immer noch nicht vorhanden ist? Es gibt also noch eine weitere Wartezeit namens Fluent Wait.
Flieรend warten
- Dies ist eine Implementierung der Wait-Schnittstelle mit eigenem Timeout und Abfrageintervall. Jede FluentWait-Instanz bestimmt die maximale Wartezeit auf eine Bedingung sowie die Hรคufigkeit, mit der die Bedingung รผberprรผft wird.
Herausforderungen im Umgang mit Ajax Call-in Selenium Webtreiber
- Die Verwendung des Befehls โPauseโ zur Bearbeitung von Ajax-Anrufen ist nicht vรถllig zuverlรคssig. Eine lange Pausenzeit macht den Test unannehmbar langsam und erhรถht die Testdauer Tests Zeit. Stattdessen wird โwaitforconditionโ beim Testen von Ajax-Anwendungen hilfreicher sein.
- Es ist schwierig, das mit bestimmten Ajax-Anwendungen verbundene Risiko einzuschรคtzen
- Da den Entwicklern die volle Freiheit gegeben wird, Ajax-Anwendungen zu รคndern, ist der Testprozess eine Herausforderung
- Das Erstellen einer automatisierten Testanfrage kann fรผr Testtools schwierig sein, da solche AJAX-Anwendungen oft unterschiedliche Codierungs- oder Serialisierungstechniken verwenden, um POST-Daten zu รผbermitteln.
Codebeispiel fรผr Ajax HANDLING mit Selenium Webtreiber
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();
}
}
Zusammenfassung
- AJAX ermรถglicht es der Webseite, kleine Datenmengen vom Server abzurufen, ohne die gesamte Seite neu laden zu mรผssen.
- Um die Ajax-Anwendung zu testen, sollten verschiedene Wartemethoden angewendet werden
- ThreadSleep
- Implizites Warten
- Explizites Warten
- WebdriverWarten
- Flieรend warten
- Das Erstellen einer automatisierten Testanfrage kann fรผr Testtools schwierig sein, da solche AJAX-Anwendungen oft unterschiedliche Codierungs- oder Serialisierungstechniken verwenden, um POST-Daten zu รผbermitteln.

