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.
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.
- 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.

