Kuidas hallata AJAX-kõnesid Selenium Veebidraiver

⚡ Nutikas kokkuvõte

AJAX kutsub lehe osa uuendamise funktsiooni ilma uuesti laadimata, seega Selenium WebDriver peab uue sisu olemasolu eeldamise asemel ootama ja ootamisstrateegia otsustab, kas test läbib usaldusväärselt.

  • 🔘 Määratlus: AJAX hangib väikeseid andmemahte asünkroonselt ja värskendab ainult osa lehest.
  • ☑️ Põhiprobleem: Serveri vastuseaeg on teadmata, seega ei pruugi element WebDriveri otsingu ajal eksisteerida.
  • Ootevalikud: Thread.sleep, implicit wait, explicit wait, WebDriverWait ja FluentWait käituvad kõik erinevalt.
  • 🧪 Soovitan: WebDriverWait küsitleb oodatava tingimusega, kuni AJAX-i tulemus ilmub, ja jätkab seejärel kohe.
  • 🛠️ FluentWait: See lisab küsitlusintervalli ja saab katsete vahel valitud erandeid ignoreerida.
  • ⚠️ Selenium 4: Ajalõpud võtavad nüüd Durationi ja Selenium Haldur eemaldab käsitsi määratud draiveri tee.

Kuidas AJAX-kõnesid käsitleda Selenium Veebidraiver

Mis on AJAX?

AJAX tähistab asünkroonset JavaSkript ja XML ning see võimaldab veebilehel serverist väikeseid andmemahtusid hankida ilma kogu lehte uuesti laadimata.

AJAX on tehnika kiirete ja dünaamiliste veebilehtede loomiseks. See on asünkroonne ja ühendab endas JavaScript andmevorminguga ja uuendab lehe osi kogu lehe asemel. Gmail, Google Kaardid, Facebook ja YouTube kõik kasutavad seda.

Kuidas AJAX töötab?

Näiteks kui klõpsate nuppu „Esita“, JavaSkript saadab serverile päringu, tõlgendab tulemust ja värskendab praegust ekraani ilma uuesti laadimiseta. Allolev diagramm näitab seda vahetust.

AJAX-kõne diagramm brauseri ja serveri vahel ilma lehe täieliku uuestilaadimiseta

  • AJAX-kutse on brauseri asünkroonne päring, mis ei põhjusta lehe üleminekut. Kasutaja saab rakenduse kallal tööd jätkata, kuni päring vastust ootab.
  • AJAX saadab serverile HTTP-päringuid ja töötleb vastuseid lehte uuesti laadimata, seega ei saa ennustada, kui kaua serveril vastamine aega võtab.

Testija seisukohast tähendab sisu või elemendi kontrollimine vastuse saabumise ootamist. Nagu nimigi ütleb, oli algne kasulik koormus XML; enamik API-sid tagastab nüüd JSON-i.

Kuidas hallata AJAX-kõnesid Selenium Veebidraiver

AJAX-kõne käsitlemise suurim väljakutse on laadimisaja teadmine. Kuna värskendus kestab murdosa sekundist, on rakendust automatiseerimistööriista abil keeruline testida, seega Selenium WebDriver peab kõnele rakendama ootamismeetodit.

Selle ootamiskäsu käivitamine peatab praeguse Testjuhtum kuni ilmub oodatav või uus väärtus; Selenium Seejärel jätkab WebDriver peatatud samme.

Järgnevalt on toodud ootemeetodid, mis Selenium WebDriver saab kasutada

Thread.sleep()

  • Thread.sleep() pole tark valik, kuna see peatab praeguse lõime määratud ajaks.
  • AJAX-is ei saa kunagi täpset ooteaega kindlalt teada, seega test ebaõnnestub, kui element selles ei esine. See lisab ka üldkulu, sest Thread.sleep(t) liigutab praeguse lõime töötavast järjekorrast ootejärjekorda.
  • Aja 't' möödudes liigub niit valmisoleku järjekorda ja ootab seejärel uuesti, et protsessor selle üles korjaks.

Märge: the,en Java meetod on Thread.sleep() väiketähega; suurtähtedega algustähte ei kirjutata.

Kaudne ootamine ()

  • See meetod annab WebDriverile käsu oodata, kui element pole kohe saadaval, ja säte jääb kehtima kogu brauseri seansi ajaks. Seega võib iga elemendi otsing võtta nii kaua aega, kui kaudne ooteaeg lubab.

Otsene ootamine ()

  • Otsene ootamine kasutatakse testi täitmise külmutamiseks, kuni konkreetne tingimus on täidetud või maksimaalne aeg möödub.

WebDriverOota

  • Seda saab kasutada mis tahes tingimuse korral, kombineerides WebDriverWaiti oodatava tingimusega.
  • Parim lähenemisviis on kontrollida tingimust iga sekund ja liikuda järgmise käsu juurde kohe, kui see on täidetud.

Kuid kõigi nende ootamiste probleem on see, et peate mainima ajalõpu ühikut. Mis siis, kui elementi ei ole aja jooksul ikka veel olemas? Seega on veel üks ootamine, mida nimetatakse Fluent ootamiseks.

Sujuv ootamine

  • See on Wait-liidese implementatsioon, millel on oma ajalõpp ja küsitlusintervall. Iga FluentWaiti eksemplar määrab tingimuse ootamise maksimaalse aja ja selle kontrollimise sageduse.

AJAX-kõnede käsitlemise väljakutsed Selenium Veebidraiver

  • Käskluse „paus” kasutamine ei ole usaldusväärne. Pikk paus muudab testi vastuvõetamatult aeglaseks ja suurendab Testimine aega, seega soovitati AJAX-rakenduste jaoks hoopis „waitforcondition”.
  • Konkreetsete AJAX-rakendustega seotud riski on raske hinnata.
  • Arendajatele täieliku vabaduse andmine AJAX-rakenduse muutmiseks muudab testimisprotsessi keeruliseks
  • Automaatse testipäringu loomine võib testimistööriistadele olla keeruline, kuna AJAX-rakendused kasutavad POST-andmete esitamiseks sageli erinevat kodeerimis- või serialiseerimistehnikat.

Märge: „Paus” ja „ootustingimus” on Seleeni käsud eemaldati Selenium 3; WebDriveri vaste on selgesõnaline ootamine.

Code Näide AJAX-i haldamisest, kasutades Selenium Veebidraiver

. TestNG Allolev klass loeb teksti, klõpsab raadionupul, ootab AJAX-vastust ja kinnitab, et tekst on muutunud.

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();
	}
	
}

Märge: on Selenium 4 läbimine Kestus.sekundid(5) WebDriverWaitile ja eemaldage System.setProperty rida, sest Selenium Haldur lahendab chromedriveri probleemi.

KKK

Ei. int ja long konstruktorid eemaldati. Selle asemel edasta Duration.ofSeconds(5) ja kasuta Durationit implicitlyWaiti, pageLoadTimeouti ja iga FluentWaiti sätte jaoks.

Kasutage koos pöörleva lokaatoriga funktsiooni ExpectedConditions.invisibilityOfElementLocated. Ainult sihtelemendi ootamine möödub sageli liiga vara, kuna pealiskiht blokeerib endiselt klõpsu.

Käivita skript „return jQuery.active == 0“ wait until blokis. See annab nulli ainult siis, kui ühtegi jQuery päringut pole veel avatud.

AJAX-vastus asendas DOM-sõlme, millele teie WebElement osutas. Leidke element pärast ootamist uuesti, selle asemel et varasemat viidet uuesti kasutada.

Tehisintellekti mudelid õpivad tüüpilisi reageerimisaegu, et elemendi järgi ooteaegu häälestada, märgistada vahelduvaid, mitte tegelikke tõrkeid, ja grupeerida need nii, et üks algpõhjus saaks korraga parandatud.

Jah. GitHubi koopia mustandid WebDriverWaiti ja FluentWaiti blokid kommentaarist, aga veendu, et ExpectedCondition vastab lehe tegelikule käitumisele.

Ei. Selenium dokumentatsioon hoiatab, et nende segamine põhjustab ettearvamatuid ajalõpusid. Hoidke kaudne ooteaeg nulli peal ja tuginege otsestele ooteaegadele.

Mitte sellest ajast alates Selenium 4.6. Selenium Haldur laadib alla ja konfigureerib sobiva draiveri, seega on rida vaja ainult kohaliku draiveri binaarfaili kinnitamiseks.

Võta see postitus kokku järgmiselt: