Kako upravljati AJAX pozivima Selenium Webdriver

โšก Pametni saลพetak

AJAX pozivi aลพuriraju dio stranice bez ponovnog uฤitavanja, dakle Selenium WebDriver mora ฤekati novi sadrลพaj umjesto da pretpostavi da je prisutan, a strategija ฤekanja odluฤuje hoฤ‡e li test pouzdano proฤ‡i.

  • ๐Ÿ”˜ Definicija: AJAX asinkrono dohvaฤ‡a male koliฤine podataka i osvjeลพava samo dio stranice.
  • โ˜‘๏ธ Osnovni problem: Vrijeme odgovora posluลพitelja nije poznato, pa element moลพda ne postoji kada WebDriver traลพi.
  • โœ… Opcije ฤekanja: Thread.sleep, implicitno ฤekanje, eksplicitno ฤekanje, WebDriverWait i FluentWait se ponaลกaju drugaฤije.
  • ๐Ÿงช Preporuฤena: WebDriverWait s ExpectedCondition ispituje dok se ne pojavi AJAX rezultat, a zatim odmah nastavlja.
  • ๐Ÿ› ๏ธ FluentWait: Dodaje interval ispitivanja i moลพe ignorirati odabrane iznimke izmeฤ‘u pokuลกaja.
  • โš ๏ธ Selenium 4: Vremenska ograniฤenja sada traju i Selenium Upravitelj uklanja ruฤnu putanju upravljaฤkog programa.

Kako rukovati AJAX pozivima u Selenium webdriver

ล to je AJAX?

AJAX je kratica za Asynchronous JavaSkripta i XML, te omoguฤ‡uje web stranici dohvaฤ‡anje malih koliฤina podataka s posluลพitelja bez ponovnog uฤitavanja cijele stranice.

AJAX je tehnika za izgradnju brzih, dinamiฤnih web stranica. Asinkrona je, kombinira JavaScript s formatom podataka i aลพurira dijelove stranice umjesto cijele stranice. Gmail, Google Karte, Facebook i YouTube svi ga koriste.

Kako AJAX funkcionira?

Na primjer, kada kliknete gumb za slanje, JavaSkripta ลกalje zahtjev posluลพitelju, interpretira rezultat i aลพurira trenutni zaslon bez ponovnog uฤitavanja. Dijagram u nastavku prikazuje tu razmjenu.

Dijagram AJAX poziva izmeฤ‘u preglednika i posluลพitelja bez potpunog ponovnog uฤitavanja stranice

  • AJAX poziv je asinkroni zahtjev preglednika koji ne uzrokuje promjenu stranice. Korisnik moลพe nastaviti raditi na aplikaciji dok zahtjev ฤeka odgovor.
  • AJAX ลกalje HTTP zahtjeve posluลพitelju i obraฤ‘uje odgovor bez ponovnog uฤitavanja stranice, tako da ne moลพete predvidjeti koliko ฤ‡e vremena posluลพitelju trebati za odgovor.

S glediลกta testera, provjera sadrลพaja ili elementa znaฤi ฤekanje dolaska odgovora. Korisni teret izvorno je bio XML, kao ลกto i samo ime govori; veฤ‡ina API-ja sada vraฤ‡a JSON.

Kako upravljati AJAX pozivima Selenium webdriver

Najveฤ‡i izazov u rukovanju AJAX pozivom je poznavanje vremena uฤitavanja. Buduฤ‡i da aลพuriranje traje djeliฤ‡ sekunde, aplikaciju je teลกko testirati putem alata za automatizaciju, pa Selenium WebDriver mora primijeniti metodu ฤekanja na poziv.

Izvrลกavanje te naredbe ฤekanja obustavlja trenutni Testni sluฤaj dok se ne pojavi oฤekivana ili nova vrijednost; Selenium WebDriver zatim nastavlja prekinute korake.

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, pa test ne uspijeva ako se element ne pojavljuje unutar njega. To takoฤ‘er dodaje optereฤ‡enje, jer Thread.sleep(t) premjeลกta trenutnu nit iz reda ฤekanja u red ฤekanja.
  • Nakon vremena 't' nit se premjeลกta u red ฤekanja, a zatim ponovno ฤeka da je CPU preuzme.

Biljeลกka: o Java metoda je Thread.sleep() malim slovom; oblik napisan velikim slovom se ne kompajlira.

Implicitno ฤekanje()

  • Ova metoda nalaลพe WebDriveru da ฤeka kada element nije odmah dostupan, a postavka ostaje na snazi โ€‹โ€‹tijekom cijele sesije preglednika. Stoga svako pretraลพivanje elementa moลพe trajati onoliko dugo koliko implicitno ฤekanje dopuลกta.

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 bilo koji uvjet, kombiniranjem WebDriverWait s ExpectedCondition.
  • Najbolji pristup je provjeravati uvjet svake sekunde i prijeฤ‡i na sljedeฤ‡u naredbu ฤim je ispunjen.

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 Wait s vlastitim vremenskim ograniฤenjem i intervalom ispitivanja. Svaka instanca FluentWait postavlja maksimalno vrijeme ฤekanja uvjeta i koliko ฤesto ga provjeravati.

Izazovi u rukovanju AJAX pozivima Selenium webdriver

  • Koriลกtenje naredbe "pauza" nije pouzdano. Duga pauza ฤini test neprihvatljivo sporim i poveฤ‡ava Ispitivanje vrijeme, pa je za AJAX aplikacije umjesto toga preporuฤeno "waitforcondition".
  • Teลกko je procijeniti rizik povezan s odreฤ‘enim AJAX aplikacijama
  • Davanje programerima pune slobode za mijenjanje AJAX aplikacije ฤini proces testiranja izazovnim
  • Izrada automatiziranog zahtjeva za testiranje moลพe biti teลกka za alate za testiranje jer AJAX aplikacije ฤesto koriste drugaฤiju tehniku โ€‹โ€‹kodiranja ili serijalizacije za slanje POST podataka.

Biljeลกka: โ€žpauzaโ€œ i โ€žฤekanje na uvjetโ€œ su Selenski naredbe uklonjene u Selenium 3; ekvivalent WebDrivera je eksplicitno ฤekanje.

Code Primjer za AJAX rukovanje koriลกtenjem Selenium webdriver

The TestNG Klasa ispod ฤita tekst, klikne na radio gumb, ฤeka AJAX odgovor i potvrฤ‘uje da se tekst promijenio.

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

Biljeลกka: on Selenium 4 prolaz Trajanje.sekundi(5) u WebDriverWait i izostaviti redak System.setProperty, jer Selenium Upravitelj rjeลกava chromedriver.

Pitanja i odgovori

Ne. Konstruktori int i long su uklonjeni. Umjesto toga proslijedite Duration.ofSeconds(5) i koristite Duration za implicitlyWait, pageLoadTimeout i svaku FluentWait postavku.

Koristite ExpectedConditions.invisibilityOfElementLocated s lokatorom spinnera. ฤŒekanje samog ciljnog elementa ฤesto prerano proฤ‘e, dok prekrivni sloj i dalje blokira klik.

Izvrลกite skriptu return jQuery.active == 0 unutar bloka ฤekanja. Izvjeลกtava nulu samo kada nijedan jQuery zahtjev nije otvoren.

AJAX odgovor je zamijenio DOM ฤvor na koji je pokazivao vaลก WebElement. Ponovno pronaฤ‘ite element nakon ฤekanja umjesto ponovne upotrebe ranije reference.

Modeli umjetne inteligencije uฤe tipiฤna vremena odziva kako bi prilagodili ฤekanja po elementu, oznaฤili povremene, a ne stvarne kvarove te ih grupirali tako da se jedan temeljni uzrok ispravi odjednom.

Da. GitHub kopilot izraฤ‘uje blokove WebDriverWait i FluentWait iz komentara, ali potvrฤ‘uje da se ExpectedCondition podudara sa stvarnim ponaลกanjem stranice.

Ne. Selenium Dokumentacija upozorava da njihovo mijeลกanje uzrokuje nepredvidive vremenske prekoraฤenja. Implicitno ฤekanje zadrลพite na nuli i oslonite se na eksplicitna ฤekanja.

Ne od tada Selenium 4.6. Selenium Upravitelj preuzima i konfigurira odgovarajuฤ‡i upravljaฤki program, tako da je linija potrebna samo za priฤvrลกฤ‡ivanje lokalne binarne datoteke upravljaฤkog programa.

Saลพmite ovu objavu uz: