Kako upravljati AJAX pozivima Selenium Webdriver
Što je Ajax?
AJAX je kratica za asinhron JavaSkripta i XML, i omogućuje web-stranici dohvaćanje malih količina podataka s poslužitelja bez ponovnog učitavanja cijele stranice.
Ajax je tehnika koja se koristi za izradu brzih i dinamičnih web stranica. Ova tehnika je asinkrona i koristi kombinaciju Javascript i XML. Ažurirat će dio/e web-stranice bez ponovnog učitavanja cijele stranice. Neke od poznatih aplikacija koje koriste AJAX tehniku su Gmail, Google Maps, Facebook, Youtube itd.
Kako radi Ajax?
Na primjer, kada kliknete gumb za slanje, JavaScript uputit će zahtjev poslužitelju, protumačiti rezultat i ažurirati trenutni zaslon bez ponovnog učitavanja web stranice.
- Ajax poziv je asinkroni zahtjev koji pokreće preglednik koji ne rezultira izravno prijelazom stranice. To znači da, ako pokrenete Ajax zahtjev, korisnik i dalje može raditi na aplikaciji dok zahtjev čeka na odgovor.
- AJAX šalje HTTP zahtjeve od klijenta do poslužitelja i zatim obrađuje odgovor poslužitelja, bez ponovnog učitavanja cijele stranice. Dakle, kada uputite AJAX poziv, vi niste baš sigurni koliko je vremena potrebno poslužitelju da vam pošalje odgovor.
Sa stajališta ispitivača, ako provjeravate sadržaj ili element koji treba prikazati, trebate pričekati dok ne dobijete odgovor. Tijekom AJAX poziva podaci se pohranjuju u XML formatu i dohvaćaju s poslužitelja.
Kako upravljati Ajax pozivima Selenium Webdriver
The najveći izazov u rukovanju Ajax pozivom je znati vrijeme učitavanja web stranice. Budući da će učitavanje web stranice trajati samo djelić sekunde, testeru je teško testirati takvu aplikaciju putem alata za automatizaciju. Za to, Selenium Webdriver mora koristiti metodu čekanja na ovom Ajax pozivu.
Dakle, izvršavanjem ove naredbe čekanja, selen će obustaviti izvršenje struje Testni slučaj i pričekajte očekivanu ili novu vrijednost. Kada se pojavi nova vrijednost ili polje, obustavljeni testni slučajevi će se izvršiti do Selenium Webdriver.
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. Dakle, vaš test neće uspjeti ako se element ne pojavi unutar vremena čekanja. Štoviše, povećava opterećenje jer pozivanje Thread.sleep(t) premješta trenutnu nit iz reda čekanja u red čekanja.
- Nakon što je dosegnuto vrijeme 't', trenutna nit će se premjestiti iz reda čekanja u red čekanja, a zatim je potrebno neko vrijeme da ju CPU odabere i pokrene.
Implicitno čekanje()
- Ova metoda govori webdriveru da pričeka ako element nije odmah dostupan, ali to će čekanje trajati cijelo vrijeme dok je preglednik otvoren. Stoga bi svako traženje elemenata na stranici moglo potrajati vrijeme na koje je postavljeno implicitno čekanje.
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 sve uvjete. To se može postići s WebDriverWait u kombinaciji s ExpectedCondition
- Najbolji način dinamičkog čekanja elementa je provjeravanje uvjeta svake sekunde i nastavak na sljedeću naredbu u skripti čim se uvjet ispuni.
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 čekanja koja ima svoje vremensko ograničenje i interval prozivanja. Svaka instanca FluentWait određuje maksimalno vrijeme čekanja na uvjet, kao i učestalost provjere uvjeta.
Izazovi u rukovanju Ajax pozivom Selenium Webdriver
- Korištenje naredbe “pause” za rukovanje Ajax pozivom nije potpuno pouzdano. Duga pauza čini test neprihvatljivo sporim i povećava Ispitivanje vrijeme. Umjesto toga, "waitforcondition" će biti korisniji u testiranju Ajax aplikacija.
- Teško je procijeniti rizik povezan s određenim Ajax aplikacijama
- Davanje pune slobode programerima da modificiraju Ajax aplikaciju čini proces testiranja izazovnim
- Stvaranje automatiziranog testnog zahtjeva može biti teško za alate za testiranje jer takve AJAX aplikacije često koriste različite tehnike kodiranja ili serijalizacije za slanje POST podataka.
Primjer koda za korištenje Ajax HANDLING-a 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(); } }
rezime
- AJAX omogućuje web stranici dohvaćanje malih količina podataka s poslužitelja bez ponovnog učitavanja cijele stranice.
- Za testiranje Ajax aplikacije treba primijeniti različite metode čekanja
- ThreadSleep
- Implicitno čekanje
- Eksplicitno čekanje
- WebdriverWait
- Tečno pričekajte
- Stvaranje automatiziranog testnog zahtjeva može biti teško za alate za testiranje jer takve AJAX aplikacije često koriste različite tehnike kodiranja ili serijalizacije za slanje POST podataka.