Hur man hanterar AJAX-samtal in Selenium Webdriver
Vad รคr Ajax?
AJAX stรฅr fรถr Asynchronous JavaSkript och XML, och det gรถr att webbsidan kan hรคmta smรฅ mรคngder data frรฅn servern utan att ladda om hela sidan.
Ajax รคr en teknik som anvรคnds fรถr att skapa snabba och dynamiska webbsidor. Denna teknik รคr asynkron och anvรคnder en kombination av Javascript och XML. Den uppdaterar delar av en webbsida utan att hela sidan laddas om. Nรฅgra av de kรคnda applikationerna som anvรคnder AJAX-tekniken รคr Gmail, Google Maps, Facebook, Youtube, etc.
Hur fungerar Ajax?
Till exempel, nรคr du klickar pรฅ knappen Skicka, JavaScript kommer att gรถra en fรถrfrรฅgan till servern, tolka resultatet och uppdatera den aktuella skรคrmen utan att ladda om webbsidan.
- Ett Ajax-samtal รคr en asynkron begรคran som initieras av webblรคsaren och som inte direkt leder till en sidรถvergรฅng. Det betyder att om du avfyrar en Ajax-fรถrfrรฅgan kan anvรคndaren fortfarande arbeta med applikationen medan fรถrfrรฅgan vรคntar pรฅ ett svar.
- AJAX skickar HTTP-fรถrfrรฅgningar frรฅn klienten till servern och bearbetar sedan serverns svar, utan att ladda om hela sidan. Sรฅ nรคr du ringer ett AJAX-samtal, du รคr inte riktigt sรคkra pรฅ hur lรฅng tid det tar fรถr servern att skicka ett svar till dig.
Ur en testares synvinkel, om du kontrollerar innehรฅllet eller elementet som ska visas mรฅste du vรคnta tills du fรฅr svaret. Under AJAX-samtal lagras data i XML-format och hรคmtas frรฅn servern.
Hur man hanterar Ajax-samtal Selenium Webdriver
Ocuco-landskapet Den stรถrsta utmaningen med att hantera Ajax-samtal รคr att veta laddningstiden fรถr webbsidan. Eftersom laddningen av webbsidan bara kommer att pรฅgรฅ i en brรฅkdel av sekunder, รคr det svรฅrt fรถr testaren att testa en sรฅdan applikation genom ett automationsverktyg. Fรถr det, Selenium Webdriver mรฅste anvรคnda vรคntemetoden pรฅ detta Ajax-samtal.
Sรฅ genom att kรถra detta wait-kommando kommer selen att avbryta exekveringen av strรถm Testfall och vรคnta pรฅ det fรถrvรคntade eller nya vรคrdet. Nรคr det nya vรคrdet eller fรคltet visas kommer de tillfรคlliga testfallen att exekveras av Selenium Webdriver.
Fรถljande รคr vรคntan metoder som Selenium Webdriver kan anvรคnda
Thread.Sleep()
- Thread.Sleep () รคr inte ett klokt val eftersom det avbryter den aktuella trรฅden under den angivna tidsperioden.
- I AJAX kan du aldrig vara sรคker pรฅ den exakta vรคntetiden. Sรฅ ditt test misslyckas om elementet inte dyker upp inom vรคntetiden. Dessutom รถkar det omkostnadsbeloppet eftersom anropet av Thread.sleep(t) gรถr att den aktuella trรฅden flyttas frรฅn den lรถpande kรถn till vรคntekรถn.
- Efter tiden 't' nรฅtt kommer den aktuella trรฅden att flyttas frรฅn vรคntekรถn till klarkรถn, och sedan tar det lite tid att plockas av CPU:n och kรถras.
Implicit vรคnta()
- Denna metod sรคger รฅt webdriver att vรคnta om elementet inte รคr tillgรคngligt omedelbart, men denna vรคntan kommer att vara pรฅ plats under hela tiden webblรคsaren รคr รถppen. Sรฅ varje sรถkning efter elementen pรฅ sidan kan ta den tid som den implicita vรคntan รคr instรคlld pรฅ.
Explicit vรคnta()
- Explicit vรคntan anvรคnds fรถr att frysa testkรถrningen tills ett visst villkor uppfylls eller maximal tid lรถper ut.
WebdriverVรคnta
- Den kan anvรคndas fรถr alla fรถrhรฅllanden. Detta kan uppnรฅs med WebDriverWait i kombination med ExpectedCondition
- Det bรคsta sรคttet att vรคnta pรฅ ett element dynamiskt รคr att sรถka efter villkoret varje sekund och fortsรคtta till nรคsta kommando i skriptet sรฅ snart villkoret รคr uppfyllt.
Men problemet med alla dessa vรคntan รคr att du mรฅste nรคmna timeout-enheten. Vad hรคnder om elementet fortfarande inte รคr nรคrvarande inom tiden? Sรฅ det finns en vรคntan till som heter Fluent wait.
Flytande vรคnta
- Detta รคr en implementering av Wait-grรคnssnittet med sin timeout och pollingintervall. Varje FluentWait-instans bestรคmmer den maximala tiden fรถr att vรคnta pรฅ ett tillstรฅnd, sรฅvรคl som med vilken frekvens tillstรฅndet ska kontrolleras.
Utmaningar i att hantera Ajax Ring in Selenium Webdriver
- Att anvรคnda "paus"-kommandot fรถr att hantera Ajax-samtal รคr inte helt tillfรถrlitligt. Lรฅng paustid gรถr testet oacceptabelt lรฅngsamt och รถkar Testning tid. Istรคllet kommer "waitforcondition" att vara mer anvรคndbar fรถr att testa Ajax-applikationer.
- Det รคr svรฅrt att bedรถma risken fรถrknippad med sรคrskilda Ajax-applikationer
- Givet full frihet fรถr utvecklare att modifiera Ajax-applikationen gรถr testprocessen utmanande
- Att skapa en automatisk testbegรคran kan vara svรฅrt fรถr testverktyg eftersom en sรฅdan AJAX-applikation ofta anvรคnder olika kodnings- eller serialiseringstekniker fรถr att skicka POST-data.
Code Exempel fรถr Ajax-hantering med Selenium Webdriver
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();
}
}
Sammanfattning
- AJAX tillรฅter webbsidan att hรคmta smรฅ mรคngder data frรฅn servern utan att ladda om hela sidan.
- Fรถr att testa Ajax-applikationen bรถr olika vรคntemetoder anvรคndas
- TrรฅdSรถmn
- Implicit vรคnta
- Explicit vรคnta
- WebdriverVรคnta
- Flytande vรคnta
- Att skapa en automatisk testbegรคran kan vara svรฅrt fรถr testverktyg eftersom en sรฅdan AJAX-applikation ofta anvรคnder olika kodnings- eller serialiseringstekniker fรถr att skicka POST-data.

