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.

  • 🔘 Määritelmä: AJAX hakee pieniä määriä dataa asynkronisesti ja päivittää vain osan sivusta.
  • ☑️ Ydinongelma: Palvelimen vasteaika on tuntematon, joten elementtiä ei välttämättä ole olemassa, kun WebDriver etsii sitä.
  • ✅ Odotusvaihtoehdot: Thread.sleep, implisiittinen odotus, eksplisiittinen odotus, WebDriverWait ja FluentWait käyttäytyvät kukin eri tavalla.
  • 🧪 Suositus: WebDriverWait ExpectedCondition-arvolla suorittaa kyselyn, kunnes AJAX-tulos tulee näkyviin, ja jatkaa sitten välittömästi.
  • 🛠️ FluentWait: Se lisää kyselyvälin ja voi jättää valitut poikkeukset huomiotta yritysten välillä.
  • ⚠️ Selenium 4: Aikakatkaisut käyttävät nyt kestoa ja Selenium Manager poistaa manuaalisen ajuripolun.

AJAX-kutsujen käsittely Selenium web-ajuri

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.

Kaavio AJAX-kutsuista selaimen ja palvelimen välillä ilman koko sivun uudelleenlatausta

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

UKK

Ei. Int- ja long-konstruktorit poistettiin. Anna sen sijaan Duration.ofSeconds(5) ja käytä Duration-arvoa implicitlyWait-, pageLoadTimeout- ja kaikkien FluentWait-asetusten osalta.

Käytä ExpectedConditions.invisibilityOfElementLocated-muuttujaa spinner-paikantimen kanssa. Kohde-elementin odottaminen yksinään menee usein liian aikaisin, koska päällekkäinen elementti estää edelleen klikkauksen.

Suorita komentosarja, joka return jQuery.active == 0 wait until -lohkon sisällä. Se raportoi nollan vain, kun jQuery-pyyntöjä ei ole vielä auki.

AJAX-vastaus korvasi WebElementtisi osoittaman DOM-solmun. Etsi elementti uudelleen odotusajan jälkeen aiemman viittauksen käyttämisen sijaan.

Tekoälymallit oppivat tyypillisiä vasteaikoja säätääkseen odotusaikoja elementtikohtaisesti, merkitäkseen ajoittaisia ​​​​eikä aitoja virheitä ja ryhmitelläkseen ne siten, että yksi perimmäinen syy korjataan kerran.

Kyllä. GitHub Copilot luonnostelee WebDriverWait- ja FluentWait-lohkot kommentista, mutta varmistaa, että ExpectedCondition vastaa sivun todellista toimintaa.

Ei. Selenium dokumentaatio varoittaa, että niiden sekoittaminen aiheuttaa arvaamattomia aikakatkaisuja. Pidä implisiittinen odotus nollassa ja luota eksplisiittisiin odotusaikoihin.

Ei siitä lähtien Selenium 4.6. Selenium Manager lataa ja konfiguroi vastaavan ajurin, joten riviä tarvitaan vain paikallisen ajuribinaarin kiinnittämiseen.

Tiivistä tämä viesti seuraavasti: