Hvordan håndtere AJAX-anrop inn Selenium Webdriver
Hva er Ajax?
AJAX står for asynkron JavaSkript og XML, og det lar websiden hente små mengder data fra serveren uten å laste hele siden på nytt.
Ajax er en teknikk som brukes for å lage raske og dynamiske nettsider. Denne teknikken er asynkron og bruker en kombinasjon av Javascript og XML. Den vil oppdatere delen/delene av en nettside uten å laste hele siden på nytt. Noen av de kjente applikasjonene som bruker AJAX-teknikk er Gmail, Google Maps, Facebook, Youtube, etc.
Hvordan fungerer Ajax?
For eksempel, når du klikker på send-knappen, JavaScript vil sende en forespørsel til serveren, tolke resultatet og oppdatere gjeldende skjermbilde uten å laste inn nettsiden på nytt.
- Et Ajax-anrop er en asynkron forespørsel initiert av nettleseren som ikke direkte resulterer i en sideovergang. Det betyr at hvis du sender ut en Ajax-forespørsel, kan brukeren fortsatt jobbe med applikasjonen mens forespørselen venter på svar.
- AJAX sender HTTP-forespørsler fra klienten til serveren og behandler deretter serverens svar, uten å laste hele siden på nytt. Så når du foretar et AJAX-anrop, vil du er ikke helt sikre på tiden det tar for serveren å sende deg et svar.
Fra en testers synspunkt, hvis du sjekker innholdet eller elementet som skal vises, må du vente til du får svaret. Under AJAX-anrop lagres dataene i XML-format og hentes fra serveren.
Hvordan håndtere Ajax-anrop Selenium Webdriver
Ocuco Den største utfordringen med å håndtere Ajax-anrop er å vite lastetiden for nettsiden. Siden innlastingen av nettsiden bare vil vare i en brøkdel av sekunder, er det vanskelig for testeren å teste en slik applikasjon gjennom automatiseringsverktøy. For det, Selenium Webdriver må bruke ventemetoden på denne Ajax-anropet.
Så ved å utføre denne ventekommandoen, vil selen suspendere utførelsen av strøm Testsak og vent på forventet eller ny verdi. Når den nye verdien eller feltet vises, vil de suspenderte testsakene bli utført av Selenium Webdriver.
Følgende er ventemetodene som Selenium Webdriver kan bruke
Thread.Sleep()
- Thread.Sleep () er ikke et klokt valg da det suspenderer den gjeldende tråden i den angitte tidsperioden.
- I AJAX kan du aldri være sikker på nøyaktig ventetid. Så testen din vil mislykkes hvis elementet ikke vises innen ventetiden. Dessuten øker det overheaden fordi å ringe Thread.sleep(t) gjør at den gjeldende tråden flyttes fra kjørekøen til ventekøen.
- Etter at tiden 't' er nådd, vil gjeldende tråd flyttes fra ventekøen til klarkøen, og deretter tar det litt tid å bli plukket av CPU og kjøre.
Implisitt vent()
- Denne metoden forteller webdriver å vente hvis elementet ikke er tilgjengelig umiddelbart, men denne ventetiden vil være på plass hele tiden nettleseren er åpen. Så ethvert søk etter elementene på siden kan ta den tiden den implisitte ventetiden er satt til.
Eksplisitt vent()
- Eksplisitt ventetid brukes til å fryse testkjøringen til tidspunktet en bestemt betingelse er oppfylt eller maksimal tid utløper.
WebdriverVent
- Den kan brukes til alle forhold. Dette kan oppnås med WebDriverWait i kombinasjon med ExpectedCondition
- Den beste måten å vente på et element dynamisk er å se etter betingelsen hvert sekund og fortsette til neste kommando i skriptet så snart betingelsen er oppfylt.
Men problemet med alle disse ventetidene er at du må nevne timeout-enheten. Hva om elementet fortsatt ikke er tilstede innen tiden? Så det er en vent til som heter Fluent wait.
Flytende vent
- Dette er en implementering av Wait-grensesnittet med tidsavbrudd og pollingintervall. Hver FluentWait-forekomst bestemmer den maksimale tiden for å vente på en tilstand, samt frekvensen for å kontrollere tilstanden.
Utfordringer med å håndtere Ajax Ring inn Selenium Webdriver
- Å bruke "pause"-kommandoen for å håndtere Ajax-anrop er ikke helt pålitelig. Lang pausetid gjør testen uakseptabelt treg og øker Testing tid. I stedet vil "waitforcondition" være mer nyttig for å teste Ajax-applikasjoner.
- Det er vanskelig å vurdere risikoen knyttet til spesielle Ajax-applikasjoner
- Gitt full frihet til utviklere til å endre Ajax-applikasjonen gjør testprosessen utfordrende
- Å lage en automatisert testforespørsel kan være vanskelig for testverktøy, da slike AJAX-applikasjoner ofte bruker annen kodings- eller serialiseringsteknikk for å sende inn POST-data.
Kodeeksempel for Ajax HÅNDTERING ved hjelp 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();
}
}
Sammendrag
- AJAX lar websiden hente små mengder data fra serveren uten å laste hele siden på nytt.
- For å teste Ajax-applikasjonen bør forskjellige ventemetoder brukes
- TrådSøvn
- Implisitt vent
- Eksplisitt vent
- WebdriverVent
- Flytende vent
- Å lage en automatisert testforespørsel kan være vanskelig for testverktøy, da slike AJAX-applikasjoner ofte bruker annen kodings- eller serialiseringsteknikk for å sende inn POST-data.

