Jak zvládnout volání AJAX Selenium Webdriver

⚡ Chytré shrnutí

AJAX volá aktualizaci části stránky bez opětovného načtení, takže Selenium WebDriver musí čekat na nový obsah, místo aby předpokládal, že je přítomen, a strategie čekání rozhoduje o tom, zda test spolehlivě projde.

  • 🔘 Definice: AJAX asynchronně načítá malé množství dat a obnovuje pouze část stránky.
  • ☑️ Základní problém: Doba odezvy serveru je neznámá, takže element nemusí existovat, když ho WebDriver vyhledá.
  • (Tj. Možnosti čekání: Thread.sleep, implicitní čekání, explicitní čekání, WebDriverWait a FluentWait se chovají odlišně.
  • 🧪 Doporučená: WebDriverWait s ExpectedCondition dotazuje, dokud se neobjeví výsledek AJAX, a poté okamžitě pokračuje.
  • 🛠️ FluentWait: Přidává interval dotazování a mezi pokusy může ignorovat vybrané výjimky.
  • ⚠️ Selenium 4: Časové limity nyní trvají dobu trvání a Selenium Správce odstraní cestu k ručnímu ovladači.

Jak zvládat AJAX volání v Selenium webový ovladač

Co je AJAX?

AJAX je zkratka pro Asynchronous JavaSkript a XML a umožňuje webové stránce načítat malé množství dat ze serveru, aniž by se musela celá stránka znovu načítat.

AJAX je technika pro vytváření rychlých a dynamických webových stránek. Je asynchronní, kombinuje JavaScénář s datovým formátem a aktualizuje části stránky místo celé stránky. Gmail, Google Mapy, Facebook a YouTube všichni to používají.

Jak funguje AJAX?

Například když kliknete na tlačítko pro odeslání, JavaSkript odešle požadavek na server, interpretuje výsledek a aktualizuje aktuální obrazovku bez opětovného načtení. Níže uvedený diagram ukazuje tuto výměnu.

Schéma volání AJAX mezi prohlížečem a serverem bez úplného opětovného načtení stránky

  • Volání AJAX je asynchronní požadavek z prohlížeče, který nezpůsobuje přechod mezi stránkami. Uživatel může v aplikaci pokračovat, zatímco požadavek čeká na odpověď.
  • AJAX odesílá HTTP požadavky na server a zpracovává odpověď bez opětovného načítání stránky, takže nelze předvídat, jak dlouho bude serveru trvat, než odpoví.

Z pohledu testera znamená kontrola obsahu nebo elementu čekání na příchod odpovědi. Datová část (dataload) byla původně XML, jak název napovídá; většina API nyní vrací JSON.

Jak zvládnout volání AJAX Selenium webový ovladač

Největší výzvou při zpracování AJAX volání je znalost doby načítání. Protože aktualizace trvá zlomek sekundy, je obtížné testovat aplikaci pomocí automatizačního nástroje, takže Selenium WebDriver musí na volání použít metodu wait.

Spuštění příkazu wait pozastaví aktuální Testovací případ dokud se neobjeví očekávaná nebo nová hodnota; Selenium WebDriver poté obnoví pozastavené kroky.

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

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í, takže test selže, pokud se v ní prvek neobjeví. To také zvyšuje režii, protože Thread.sleep(t) přesune aktuální vlákno z běžící fronty do čekající fronty.
  • Po uplynutí času 't' se vlákno přesune do fronty připravených úloh a poté znovu čeká na vyzvednutí procesorem.

Poznámka: ο Java metoda je Thread.sleep() malými písmeny; tvar s velkými písmeny se nekompiluje.

Implicitní čekání ()

  • Tato metoda říká WebDriveru, aby čekal, když prvek není okamžitě dostupný, a toto nastavení zůstává v platnosti po celou relaci prohlížeče. Každé vyhledávání prvku proto může trvat tak dlouho, jak to implicitní čekání dovolí.

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 pro jakoukoli podmínku kombinací WebDriverWait s ExpectedCondition.
  • Nejlepší přístup je kontrolovat podmínku každou sekundu a přejít k dalšímu příkazu, jakmile je 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 s vlastním časovým limitem a intervalem dotazování. Každá instance FluentWait nastavuje maximální dobu čekání na podmínku a jak často ji kontrolovat.

Problémy se zpracováním AJAX volání Selenium webový ovladač

  • Použití příkazu „pause“ není spolehlivé. Dlouhá pauza test nepřijatelně zpomaluje a zvyšuje Testování čas, takže pro AJAX aplikace bylo doporučeno „waitforcondition“.
  • Je obtížné posoudit riziko spojené s konkrétními AJAX aplikacemi.
  • Dát vývojářům plnou svobodu v úpravách AJAX aplikace ztěžuje proces testování.
  • Vytvoření automatizovaného testovacího požadavku může být pro testovací nástroje obtížné, protože aplikace AJAX často používají k odesílání dat POST jinou techniku ​​kódování nebo serializace.

Poznámka: „pauza“ a „čekání na podmínku“ jsou Selenský příkazy odstraněny v Selenium 3; ekvivalentem WebDriveru je explicitní čekání.

Code Příklad pro zpracování AJAX pomocí Selenium webový ovladač

Jedno TestNG Níže uvedená třída přečte text, klikne na přepínač, čeká na odpověď AJAX a potvrdí, že se text změnil.

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();
	}
	
}

Poznámka: on Selenium 4 průchod Duration.ofSeconds(5) na WebDriverWait a zrušte řádek System.setProperty, protože Selenium Správce řeší problém s chromedriverem.

Nejčastější dotazy

Ne. Konstruktory int a long byly odstraněny. Místo nich předejte Duration.ofSeconds(5) a pro implicitlyWait, pageLoadTimeout a všechna nastavení FluentWait použijte Duration.

Použijte ExpectedConditions.invisibilityOfElementLocated s lokátorem spinneru. Čekání na samotný cílový element často proběhne příliš brzy, zatímco překryv stále blokuje kliknutí.

Spusťte skript return jQuery.active == 0 uvnitř bloku wait until. Hlásí nulu pouze tehdy, když není otevřen žádný jQuery požadavek.

Odpověď AJAX nahradila uzel DOM, na který odkazoval váš WebElement. Po uplynutí doby čekání element znovu vyhledejte, místo abyste znovu použili dřívější odkaz.

Modely umělé inteligence se učí typické doby odezvy, aby vyladily čekání na prvek, označily občasná selhání spíše než skutečná selhání a seskupily je tak, aby byla najednou opravena jedna hlavní příčina.

Ano. GitHub Copilot vytváří koncepty bloků WebDriverWait a FluentWait z komentáře, ale ověřuje, zda ExpectedCondition odpovídá skutečnému chování stránky.

Ne. Selenium Dokumentace varuje, že jejich míchání způsobuje nepředvídatelné časové limity. Implicitní čekání udržujte na nule a spoléhejte se na explicitní čekání.

Od té doby Selenium 4.6. Selenium Správce stáhne a nakonfiguruje odpovídající ovladač, takže řádek je potřeba pouze k připojení lokálního binárního souboru ovladače.

Shrňte tento příspěvek takto: