Jak zvládnout volání AJAX Selenium Webdriver

Co je Ajax?

AJAX znamená Asynchronní Javaskript a XML, a umožňuje webové stránce načíst malá množství dat ze serveru bez opětovného načtení celé stránky.

Ajax je technika používaná k vytváření rychlých a dynamických webových stránek. Tato technika je asynchronní a využívá kombinaci Javascript a XML. Aktualizuje část/y webové stránky bez opětovného načtení celé stránky. Některé ze slavných aplikací, které využívají techniku ​​AJAX, jsou Gmail, Google Maps, Facebook, Youtube atd.

Jak Ajax funguje?

Když například kliknete na tlačítko Odeslat, JavaScénář vytvoří požadavek na server, interpretuje výsledek a aktualizuje aktuální obrazovku bez opětovného načítání webové stránky.

Jak Ajax funguje

  • Volání Ajax je asynchronní požadavek iniciovaný prohlížečem, který přímo nevede k přechodu stránky. To znamená, že pokud spustíte požadavek Ajax, uživatel může stále pracovat na aplikaci, zatímco požadavek čeká na odpověď.
  • AJAX odesílá požadavky HTTP z klienta na server a poté zpracovává odpověď serveru, aniž by znovu načítal celou stránku. Takže když zavoláte AJAX, vy si nejste docela jisti, jak dlouho trvá, než vám server pošle odpověď.

Z pohledu testera, pokud kontrolujete obsah nebo prvek, který se má zobrazit, musíte počkat, až dostanete odpověď. Během volání AJAX jsou data uložena ve formátu XML a načtena ze serveru.

Jak zvládnout volání Ajaxu Selenium Webdriver

Jedno největší výzvou při zpracování volání Ajax je znát čas načítání webové stránky. Vzhledem k tomu, že načítání webové stránky bude trvat jen zlomek sekund, je pro testera obtížné otestovat takovou aplikaci pomocí automatizačního nástroje. Pro to, Selenium Webdriver musí v tomto volání Ajax použít metodu čekání.

Takže provedením tohoto příkazu čekání zastaví selen provádění proudu Testovací případ a počkejte na očekávanou nebo novou hodnotu. Když se objeví nová hodnota nebo pole, provedou se pozastavené testovací případy Selenium Webdriver.

Níže jsou uvedeny metody čekání, které Selenium Webdriver může použít

Thread.Sleep()

  • Thread.Sleep () není moudrá volba, protože pozastaví aktuální vlákno na zadanou dobu.
  • V AJAXu si nikdy nemůžete být jisti přesnou dobou čekání. Váš test tedy selže, pokud se prvek během čekací doby nezobrazí. Navíc zvyšuje režii, protože volání Thread.sleep(t) způsobí, že aktuální vlákno bude přesunuto z běžící fronty do čekající fronty.
  • Po dosažení času 't' se aktuální vlákno přesune z čekající fronty do fronty připravených a pak nějakou dobu trvá, než jej CPU vybere a spustí.

Implicitní čekání ()

  • Tato metoda říká webdriveru, aby počkal, pokud prvek není dostupný okamžitě, ale toto čekání bude platit po celou dobu, kdy je prohlížeč otevřený. Jakékoli hledání prvků na stránce tedy může trvat dobu, na kterou je nastaveno implicitní čekání.

Explicitní čekání ()

  • Explicitní čekání se používá ke zmrazení provádění testu do doby, kdy je splněna určitá podmínka, nebo do uplynutí maximální doby.

WebdriverPočkejte

  • Lze jej použít za jakýchkoli podmínek. Toho lze dosáhnout pomocí WebDriverWait v kombinaci s ExpectedCondition
  • Nejlepší způsob, jak dynamicky čekat na prvek, je kontrolovat podmínku každou sekundu a pokračovat k dalšímu příkazu ve skriptu, jakmile je podmínka splněna.

Ale problém všech těchto čekání je, že musíte zmínit jednotku časového limitu. Co když prvek stále není v daném čase přítomen? Takže je tu ještě jedno čekání s názvem Fluent wait.

Plynule počkejte

  • Toto je implementace rozhraní Wait, které má svůj časový limit a interval dotazování. Každá instance FluentWait určuje maximální dobu čekání na stav a také frekvenci, s jakou se má stav kontrolovat.

Výzvy při vyřizování hovorů Ajax Selenium Webdriver

  • Použití příkazu „pause“ pro zpracování volání Ajax není zcela spolehlivé. Dlouhá pauza test nepřijatelně zpomaluje a zvyšuje Testování čas. Místo toho bude při testování aplikací Ajax užitečnější „waitforcondition“.
  • Je obtížné posoudit riziko spojené s konkrétními aplikacemi Ajax
  • Díky plné svobodě vývojářů upravovat aplikaci Ajax je proces testování náročný
  • Vytvoření automatizovaného požadavku na test může být pro testovací nástroje obtížné, protože taková aplikace AJAX často používá k odesílání dat POST různé techniky kódování nebo serializace.

Příklad kódu pro použití Ajax HANDLING 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();
	}
	
}

Shrnutí

  • AJAX umožňuje webové stránce načíst malé množství dat ze serveru bez opětovného načtení celé stránky.
  • Chcete-li otestovat aplikaci Ajax, měly by být použity různé metody čekání
    • ThreadSleep
    • Implicitní čekání
    • Explicitně čekejte
    • WebdriverPočkejte
    • Plynule počkejte
  • Vytvoření automatizovaného požadavku na test může být pro testovací nástroje obtížné, protože taková aplikace AJAX často používá k odesílání dat POST různé techniky kódování nebo serializace.