Az AJAX-hívások kezelése Selenium Webdriver

⚡ Okos összefoglaló

Az AJAX az oldal egy részének frissítését hívja újratöltés nélkül, tehát Selenium A WebDrivernek várnia kell az új tartalomra ahelyett, hogy feltételezné annak jelenlétét, és a várakozási stratégia dönti el, hogy a teszt megbízhatóan sikeresen átmegy-e.

  • 🔘 Meghatározás: Az AJAX kis mennyiségű adatot kér le aszinkron módon, és csak az oldal egy részét frissíti.
  • ☑️ Alapvető probléma: A szerver válaszideje ismeretlen, így előfordulhat, hogy az elem nem létezik, amikor a WebDriver keres.
  • ✅ Várakozási lehetőségek: A Thread.sleep, az implicit várakozás, az explicit várakozás, a WebDriverWait és a FluentWait mindegyike másképp viselkedik.
  • 🧪 Ajánlott: A WebDriverWait egy ExpectedCondition feltétellel lekérdezi, amíg meg nem jelenik az AJAX eredmény, majd azonnal folytatja.
  • 🇧🇷 FluentWait: Hozzáad egy lekérdezési intervallumot, és figyelmen kívül hagyhatja a kiválasztott kivételeket a kísérletek között.
  • ⚠️ Selenium 4: Az időtúllépések mostantól az Időtartamot veszik figyelembe, és Selenium A Manager eltávolítja a manuális illesztőprogram-útvonalat.

Hogyan kezeljük az AJAX hívásokat Selenium webdriver

Mi az AJAX?

Az AJAX az aszinkron rövidítése JavaSzkript és XML, és lehetővé teszi a weboldal számára, hogy kis mennyiségű adatot kérjen le a szerverről a teljes oldal újratöltése nélkül.

Az AJAX egy technika gyors, dinamikus weboldalak létrehozására. Aszinkron, egyesíti a JavaForgatókönyv adatformátummal, és az oldal részeit frissíti a teljes oldal helyett. Gmail, Google Térképek, Facebook és YouTube mindannyian használják.

Hogyan működik az AJAX?

Például, amikor rákattintunk a küldés gombra, JavaA szkript küld egy kérést a szervernek, értelmezi az eredményt, és újratöltés nélkül frissíti az aktuális képernyőt. Az alábbi ábra ezt a cserét mutatja.

Egy böngésző és szerver közötti AJAX hívás diagramja teljes oldal újratöltése nélkül

  • Az AJAX-hívás egy aszinkron kérés a böngészőtől, amely nem okoz oldalátmenetet. A felhasználó folytathatja a munkát az alkalmazáson, amíg a kérés válaszra vár.
  • Az AJAX HTTP kéréseket küld a szervernek, és a válaszokat az oldal újratöltése nélkül dolgozza fel, így nem lehet megjósolni, hogy mennyi időbe telik a szervernek válaszolnia.

Egy tesztelő szempontjából a tartalom vagy egy elem ellenőrzése azt jelenti, hogy meg kell várni a válasz megérkezését. A hasznos adat eredetileg XML volt, ahogy a neve is mutatja; a legtöbb API ma már JSON-t ad vissza.

Az AJAX-hívások kezelése Selenium webdriver

Az AJAX-hívások kezelésének legnagyobb kihívása a betöltési idő ismerete. Mivel a frissítés a másodperc töredéke alatt tart, az alkalmazást nehéz automatizálási eszközzel tesztelni, így Selenium A WebDrivernek egy wait metódust kell alkalmaznia a hívásra.

A várakozási parancs végrehajtása felfüggeszti az aktuális Teszt eset amíg a várt vagy új érték meg nem jelenik; Selenium A WebDriver ezután folytatja a felfüggesztett lépéseket.

Az alábbiakban bemutatjuk azokat a várakozási módszereket, amelyek Selenium A WebDriver használhatja

Thread.sleep()

  • A Thread.sleep() nem egy bölcs választás, mivel felfüggeszti az aktuális szálat a megadott időre.
  • Az AJAX-ban sosem lehetünk biztosak a pontos várakozási időben, így a teszt sikertelen, ha az elem nem jelenik meg benne. Ez többletterhelést is jelent, mivel a Thread.sleep(t) áthelyezi az aktuális szálat a futó sorból a várakozó sorba.
  • Az 't' idő elteltével a szál átkerül a kész várólistába, majd ismét várakozik, hogy a CPU felvegye.

Jegyzet: a Java a módszer Thread.sleep() kisbetűvel; a nagybetűs forma nem fordul elő.

Implicit várakozás ()

  • Ez a metódus arra utasítja a WebDrivert, hogy várjon, ha egy elem nem érhető el azonnal, és a beállítás a teljes böngésző-munkamenet alatt érvényben marad. Minden elemkeresés tehát addig tarthat, ameddig az implicit várakozás megengedi.

Explicit várakozás ()

  • Kifejezett várakozás A teszt végrehajtásának leállítására szolgál addig, amíg egy adott feltétel teljesül, vagy a maximális idő le nem telik.

WebDriverVárjon

  • Bármely feltételhez használható a WebDriverWait és egy ExpectedCondition kombinálásával.
  • A legjobb megközelítés az, hogy minden másodpercben ellenőrizzük a feltételt, és amint teljesül, ugorjunk a következő parancsra.

De a probléma ezzel a várakozással az, hogy meg kell említeni az időtúllépési egységet. Mi van akkor, ha az elem még mindig nincs jelen az időn belül? Tehát van még egy várakozás, amit Fluent várakozásnak hívnak.

Folyékony várakozás

  • Ez a Wait interfész egy implementációja, saját időtúllépéssel és lekérdezési intervallummal. Minden FluentWait példány beállítja a feltételre való várakozás maximális idejét és az ellenőrzés gyakoriságát.

Az AJAX hívások kezelésének kihívásai Selenium webdriver

  • A „szünet” parancs használata nem megbízható. A hosszú szünet elfogadhatatlanul lassúvá teszi a tesztet és növeli a Tesztelés idő, ezért az AJAX alkalmazásokhoz ehelyett a „waitforcondition”-t ajánlották.
  • Nehéz felmérni az egyes AJAX alkalmazásokhoz kapcsolódó kockázatokat.
  • A fejlesztők teljes szabadságának megadása az AJAX alkalmazások módosítására megnehezíti a tesztelési folyamatot
  • Az automatizált tesztkérés létrehozása nehézkes lehet a tesztelőeszközök számára, mivel az AJAX alkalmazások gyakran eltérő kódolási vagy szerializációs technikát használnak a POST adatok elküldéséhez.

Jegyzet: A „szünet” és a „feltételre várakozás” funkciók szelén parancsok eltávolítva a következőből: Selenium 3; a WebDriver megfelelője egy explicit várakozás.

Code Példa AJAX kezelésre Selenium webdriver

Az TestNG Az alábbi osztály beolvassa a szöveget, rákattint a választógombra, megvárja az AJAX választ, és kijelenti, hogy a szöveg megváltozott.

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

Jegyzet: on Selenium 4 passz Időtartam.másodperc(5) a WebDriverWait parancshoz, és törölje a System.setProperty sort, mert Selenium A kezelő feloldja a chromedriver problémáját.

GYIK

Nem. Az int és long konstruktorokat eltávolítottuk. Helyette add át a Duration.ofSeconds(5) függvényt, és használd a Duration függvényt az implicitlyWait, a pageLoadTimeout és minden FluentWait beállításhoz.

Használja az ExpectedConditions.invisibilityOfElementLocated függvényt a forgó lokátorral. A célelemre való önálló várakozás gyakran túl korán telik el, miközben az overlay még blokkolja a kattintást.

Hajtsa végre a következő szkriptet: return jQuery.active == 0 egy wait until blokkon belül. Csak akkor jelez nullát, ha még nincs megnyitott jQuery kérés.

Az AJAX válasz lecserélte a WebElement által megadott DOM csomópontot. A várakozás után keresse meg újra az elemet a korábbi hivatkozás újbóli használata helyett.

A mesterséges intelligencia modellek megtanulják a tipikus válaszidőket, hogy elemenként hangolják a várakozási időket, a valódi hibák helyett időszakos hibákat jelöljenek, és csoportosítsák őket, hogy egyetlen kiváltó okot egyszer lehessen javítani.

Igen. GitHub másodpilóta A WebDriverWait és FluentWait blokkokat draftolja egy megjegyzésből, de ellenőrzi, hogy az ExpectedCondition megfelel-e a tényleges oldal viselkedésének.

Nem. Selenium A dokumentáció figyelmeztet, hogy keverésük kiszámíthatatlan időtúllépéseket okozhat. Tartsa az implicit várakozást nullán, és támaszkodjon az explicit várakozásokra.

Azóta nem Selenium 4.6. Selenium A Manager letölti és konfigurálja a megfelelő illesztőprogramot, így a sorra csak a helyi illesztőprogram bináris fájljának kitűzéséhez van szükség.

Foglald össze ezt a bejegyzést a következőképpen: