Kako upravljati AJAX pozivima Selenium Webdriver
โก Pametni saลพetak
AJAX pozivi aลพuriraju dio stranice bez ponovnog uฤitavanja, dakle Selenium WebDriver mora ฤekati novi sadrลพaj umjesto da pretpostavi da je prisutan, a strategija ฤekanja odluฤuje hoฤe li test pouzdano proฤi.
ล to je AJAX?
AJAX je kratica za Asynchronous JavaSkripta i XML, te omoguฤuje web stranici dohvaฤanje malih koliฤina podataka s posluลพitelja bez ponovnog uฤitavanja cijele stranice.
AJAX je tehnika za izgradnju brzih, dinamiฤnih web stranica. Asinkrona je, kombinira JavaScript s formatom podataka i aลพurira dijelove stranice umjesto cijele stranice. Gmail, Google Karte, Facebook i YouTube svi ga koriste.
Kako AJAX funkcionira?
Na primjer, kada kliknete gumb za slanje, JavaSkripta ลกalje zahtjev posluลพitelju, interpretira rezultat i aลพurira trenutni zaslon bez ponovnog uฤitavanja. Dijagram u nastavku prikazuje tu razmjenu.
- AJAX poziv je asinkroni zahtjev preglednika koji ne uzrokuje promjenu stranice. Korisnik moลพe nastaviti raditi na aplikaciji dok zahtjev ฤeka odgovor.
- AJAX ลกalje HTTP zahtjeve posluลพitelju i obraฤuje odgovor bez ponovnog uฤitavanja stranice, tako da ne moลพete predvidjeti koliko ฤe vremena posluลพitelju trebati za odgovor.
S glediลกta testera, provjera sadrลพaja ili elementa znaฤi ฤekanje dolaska odgovora. Korisni teret izvorno je bio XML, kao ลกto i samo ime govori; veฤina API-ja sada vraฤa JSON.
Kako upravljati AJAX pozivima Selenium webdriver
Najveฤi izazov u rukovanju AJAX pozivom je poznavanje vremena uฤitavanja. Buduฤi da aลพuriranje traje djeliฤ sekunde, aplikaciju je teลกko testirati putem alata za automatizaciju, pa Selenium WebDriver mora primijeniti metodu ฤekanja na poziv.
Izvrลกavanje te naredbe ฤekanja obustavlja trenutni Testni sluฤaj dok se ne pojavi oฤekivana ili nova vrijednost; Selenium WebDriver zatim nastavlja prekinute korake.
Slijede metode ฤekanja koje Selenium WebDriver moลพe koristiti
Thread.sleep()
- Thread.sleep() nije mudar izbor jer obustavlja trenutnu nit na odreฤeno vrijeme.
- U AJAX-u nikada ne moลพete biti sigurni u toฤno vrijeme ฤekanja, pa test ne uspijeva ako se element ne pojavljuje unutar njega. To takoฤer dodaje optereฤenje, jer Thread.sleep(t) premjeลกta trenutnu nit iz reda ฤekanja u red ฤekanja.
- Nakon vremena 't' nit se premjeลกta u red ฤekanja, a zatim ponovno ฤeka da je CPU preuzme.
Biljeลกka: o Java metoda je Thread.sleep() malim slovom; oblik napisan velikim slovom se ne kompajlira.
Implicitno ฤekanje()
- Ova metoda nalaลพe WebDriveru da ฤeka kada element nije odmah dostupan, a postavka ostaje na snazi โโtijekom cijele sesije preglednika. Stoga svako pretraลพivanje elementa moลพe trajati onoliko dugo koliko implicitno ฤekanje dopuลกta.
Eksplicitno ฤekanje()
- Eksplicitno ฤekanje koristi se za zamrzavanje izvoฤenja testa do trenutka ispunjenja odreฤenog uvjeta ili do isteka maksimalnog vremena.
WebDriverWait
- Moลพe se koristiti za bilo koji uvjet, kombiniranjem WebDriverWait s ExpectedCondition.
- Najbolji pristup je provjeravati uvjet svake sekunde i prijeฤi na sljedeฤu naredbu ฤim je ispunjen.
Ali problem sa svim tim ฤekanjima je taj ลกto morate spomenuti jedinicu time-out. ล to ako element joลก uvijek nije prisutan unutar vremena? Dakle, postoji joลก jedno ฤekanje koje se zove Fluent ฤekanje.
Teฤno priฤekajte
- Ovo je implementacija suฤelja Wait s vlastitim vremenskim ograniฤenjem i intervalom ispitivanja. Svaka instanca FluentWait postavlja maksimalno vrijeme ฤekanja uvjeta i koliko ฤesto ga provjeravati.
Izazovi u rukovanju AJAX pozivima Selenium webdriver
- Koriลกtenje naredbe "pauza" nije pouzdano. Duga pauza ฤini test neprihvatljivo sporim i poveฤava Ispitivanje vrijeme, pa je za AJAX aplikacije umjesto toga preporuฤeno "waitforcondition".
- Teลกko je procijeniti rizik povezan s odreฤenim AJAX aplikacijama
- Davanje programerima pune slobode za mijenjanje AJAX aplikacije ฤini proces testiranja izazovnim
- Izrada automatiziranog zahtjeva za testiranje moลพe biti teลกka za alate za testiranje jer AJAX aplikacije ฤesto koriste drugaฤiju tehniku โโkodiranja ili serijalizacije za slanje POST podataka.
Biljeลกka: โpauzaโ i โฤekanje na uvjetโ su Selenski naredbe uklonjene u Selenium 3; ekvivalent WebDrivera je eksplicitno ฤekanje.
Code Primjer za AJAX rukovanje koriลกtenjem Selenium webdriver
The TestNG Klasa ispod ฤita tekst, klikne na radio gumb, ฤeka AJAX odgovor i potvrฤuje da se tekst promijenio.
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(); } }
Biljeลกka: on Selenium 4 prolaz Trajanje.sekundi(5) u WebDriverWait i izostaviti redak System.setProperty, jer Selenium Upravitelj rjeลกava chromedriver.

