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. Det kommer att uppdatera delar av en webbsida utan att ladda om hela sidan. Några av de kända applikationerna som använder AJAX-teknik ä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.

Hur Ajax fungerar

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

Kodexempel för Ajax HANTERING med hjälp av 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.