Kuinka käsitellä AJAX-puheluita Selenium Web-ohjain
⚡ Älykäs yhteenveto
AJAX kutsuu sivun osan päivittämistä ilman uudelleenlatausta, joten Selenium WebDriverin täytyy odottaa uutta sisältöä sen sijaan, että se olettaisi sen olevan läsnä, ja odotusstrategia päättää, läpäiseekö testi luotettavasti.
Mikä on AJAX?
AJAX tulee sanoista Asynchronous JavaSkripti ja XML, ja sen avulla verkkosivu voi hakea pieniä määriä tietoa palvelimelta lataamatta koko sivua uudelleen.
AJAX on tekniikka nopeiden ja dynaamisten verkkosivujen rakentamiseen. Se on asynkroninen ja yhdistää JavaKäsikirjoitus dataformaatilla ja päivittää osia sivusta koko sivun sijaan. Gmail, Google Kartat, Facebook ja YouTube kaikki käyttävät sitä.
Miten AJAX toimii?
Esimerkiksi kun napsautat lähetyspainiketta, JavaSkripti lähettää pyynnön palvelimelle, tulkitsee tuloksen ja päivittää nykyisen näytön ilman uudelleenlatausta. Alla oleva kaavio näyttää tämän vaihdon.
- AJAX-kutsu on selaimen lähettämä asynkroninen pyyntö, joka ei aiheuta sivusiirtymää. Käyttäjä voi jatkaa sovelluksen työskentelyä pyynnön odottaessa vastausta.
- AJAX lähettää HTTP-pyyntöjä palvelimelle ja käsittelee vastauksen lataamatta sivua uudelleen, joten et voi ennustaa, kuinka kauan palvelimelta kestää vastata.
Testaajan näkökulmasta sisällön tai elementin tarkistaminen tarkoittaa odottamista vastauksen saapumiseen. Hyötykuorma oli alun perin XML, kuten nimestä voi päätellä; useimmat API:t palauttavat nykyään JSON-muodossa.
Kuinka käsitellä AJAX-puheluita Selenium web-ajuri
Suurin haaste AJAX-kutsun käsittelyssä on latausajan tunteminen. Koska päivitys kestää sekunnin murto-osan, sovellusta on vaikea testata automaatiotyökalulla, joten Selenium WebDriverin on käytettävä wait-metodia kutsuun.
Tuon odotuskomennon suorittaminen keskeyttää nykyisen Testitapaus kunnes odotettu tai uusi arvo ilmestyy; Selenium WebDriver jatkaa sitten keskeytettyjä vaiheita.
Seuraavassa on odotusmenetelmiä, jotka Selenium WebDriver voi käyttää
Thread.sleep()
- Thread.sleep() ei ole viisas valinta, koska se keskeyttää nykyisen säikeen määritetyksi ajaksi.
- AJAXissa et voi koskaan olla varma tarkasta odotusajasta, joten testi epäonnistuu, jos elementti ei esiinny siinä. Se lisää myös työmäärää, koska Thread.sleep(t) siirtää nykyisen säikeen käynnissä olevasta jonosta odottavaan jonoon.
- Ajan 't' kuluttua säie siirtyy valmiusjonoon ja odottaa sitten uudelleen, että suoritin poimii sen.
Huomautus: Ishayoiden opettaman Java menetelmä on Thread.sleep() pienellä kirjaimella; isolla alkukirjaimella kirjoitettua muotoa ei käännetä.
Implisiittinen odotus ()
- Tämä metodi käskee WebDriverin odottamaan, kun elementti ei ole välittömästi saatavilla, ja asetus pysyy voimassa koko selainistunnon ajan. Jokainen elementtihaku voi siis kestää niin kauan kuin implisiittinen odotusaika sallii.
Nimenomainen odotus ()
- Selkeä odotus käytetään pysäyttämään testin suorittaminen, kunnes tietty ehto täyttyy tai enimmäisaika kuluu.
WebDriverOdota
- Sitä voidaan käyttää mihin tahansa ehtoon yhdistämällä WebDriverWait-muuttujaan ExpectedCondition-muuttujaan.
- Paras lähestymistapa on tarkistaa ehto joka sekunti ja siirtyä seuraavaan komentoon heti, kun se täyttyy.
Mutta kaikkien näiden odotusten ongelmana on, että sinun on mainittava aikakatkaisuyksikkö. Entä jos elementtiä ei vieläkään ole ajan kuluessa? Joten on vielä yksi odotus nimeltä Fluent wait.
Sujuva odotus
- Tämä on Wait-rajapinnan toteutus, jolla on oma aikakatkaisu ja kyselyväli. Jokainen FluentWait-instanssi asettaa ehdon odotusajan enimmäismäärän ja sen tarkistustiheyden.
AJAX-kutsujen käsittelyn haasteet Selenium web-ajuri
- ”Tauko”-komennon käyttö ei ole luotettavaa. Pitkä tauko hidastaa testiä kohtuuttomasti ja lisää Testaus aikaa, joten AJAX-sovelluksille suositeltiin sen sijaan ”waitforcondition”.
- Yksittäisiin AJAX-sovelluksiin liittyvää riskiä on vaikea arvioida.
- Kehittäjien täysi vapaus muokata AJAX-sovellusta tekee testausprosessista haastavan
- Automaattisen testipyynnön luominen voi olla testaustyökaluille hankalaa, koska AJAX-sovellukset käyttävät usein eri koodaus- tai sarjoittelutekniikkaa POST-datan lähettämiseen.
Huomautus: ”tauko” ja ”odotaehto” ovat Seleeni komennot poistettu kohdassa Selenium 3; WebDriver-vastine on eksplisiittinen odotus.
Code Esimerkki AJAX-käsittelystä Selenium web-ajuri
TestNG Alla oleva luokka lukee tekstin, napsauttaa radionappia, odottaa AJAX-vastausta ja vahvistaa, että teksti on muuttunut.
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(); } }
Huomautus: on Selenium 4 pass Kesto.sekunteja(5) WebDriverWaitiin ja poista System.setProperty-rivi, koska Selenium Manageri ratkaisee chromedriver-ongelman.

