So verarbeiten Sie AJAX-Aufrufe im Selenium Webdriver

Was ist Ajax?

AJAX steht für Asynchrones JavaScript 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 zur Erstellung schneller und dynamischer Webseiten. Diese Technik ist asynchron und verwendet eine Kombination aus Javascript und XML. Es aktualisiert die Teile einer Webseite, ohne die gesamte 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, JavaScript stellt eine Anfrage an den Server, interpretiert das Ergebnis und aktualisiert den aktuellen Bildschirm, ohne die Webseite neu zu laden.

Wie Ajax funktioniert

  • Ein Ajax-Aufruf ist eine vom Browser initiierte asynchrone Anfrage, die nicht direkt zu einem Seitenübergang 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 überprüfen. Beim AJAX-Aufruf werden die Daten im XML-Format gespeichert und vom Server abgerufen.

So verarbeiten Sie Ajax-Aufrufe im Selenium Webdriver

Der Die größte Herausforderung bei der Handhabung von Ajax-Anrufen ist das Wissenwing die Ladezeit der Webseite. 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 muss Selenium Webdriver bei diesem Ajax-Aufruf die Wartemethode verwenden.

Durch die Ausführung dieses Wartebefehls unterbricht Selen die aktuelle Ausführung 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 von Selenium Webdriver ausgeführt.

Following sind die Wartemethoden, die Selenium Webdriver verwenden kann

Thread.Sleep()

  • Thread.Sleep() ist keine kluge Wahl, da es den aktuellen Thread für die angegebene Zeitspanne 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 bei der Handhabung von Ajax-Aufrufen im Selenium Webdriver

  • 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 Testen 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 Webdriver

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.