Sådan håndteres AJAX-opkald Selenium Webdriver
Hvad er Ajax?
AJAX står for Asynkron JavaScript og XML, og det giver websiden mulighed for at hente små mængder data fra serveren uden at genindlæse hele siden.
Ajax er en teknik, der bruges til at skabe hurtige og dynamiske websider. Denne teknik er asynkron og bruger en kombination af Javascript og XML. Det vil opdatere delen/dele af en webside uden at genindlæse hele siden. Nogle af de berømte applikationer, der bruger AJAX-teknikken, er Gmail, Google Maps, Facebook, Youtube osv.
Hvordan fungerer Ajax?
For eksempel, når du klikker på send-knappen, JavaScript vil fremsætte en anmodning til serveren, fortolke resultatet og opdatere den aktuelle skærm uden at genindlæse websiden.
- Et Ajax-opkald er en asynkron anmodning initieret af browseren, som ikke direkte resulterer i en sideovergang. Det betyder, at hvis du affyrer en Ajax-anmodning, kan brugeren stadig arbejde på applikationen, mens anmodningen venter på et svar.
- AJAX sender HTTP-anmodninger fra klienten til serveren og behandler derefter serverens svar uden at genindlæse hele siden. Så når du foretager et AJAX-opkald, vil du er ikke ret sikre på, hvor lang tid det tager serveren at sende dig et svar.
Fra en testers synspunkt, hvis du tjekker indholdet eller det element, der skal vises, skal du vente, indtil du får svaret. Under AJAX-opkald lagres dataene i XML-format og hentes fra serveren.
Sådan håndteres Ajax-opkald Selenium Webdriver
Den største udfordring ved at håndtere Ajax-opkald er at kende indlæsningstiden for websiden. Da indlæsningen af websiden kun vil vare i en brøkdel af sekunder, er det vanskeligt for testeren at teste en sådan applikation gennem automatiseringsværktøj. For det, Selenium Webdriver skal bruge ventemetoden på dette Ajax-opkald.
Så ved at udføre denne ventekommando vil selen suspendere udførelsen af strøm Test sag og vent på den forventede eller nye værdi. Når den nye værdi eller det nye felt vises, vil de suspenderede testsager blive udført af Selenium Webdriver.
Følgende er ventemetoderne, der Selenium Webdriver kan bruge
Thread.Sleep()
- Thread.Sleep () er ikke et klogt valg, da det suspenderer den aktuelle tråd i det angivne tidsrum.
- I AJAX kan du aldrig være sikker på den nøjagtige ventetid. Så din test mislykkes, hvis elementet ikke vises inden for ventetiden. Desuden øger det overheaden, fordi kald af Thread.sleep(t) får den aktuelle tråd til at blive flyttet fra den kørende kø til den ventende kø.
- Efter tiden 't' er nået, vil den aktuelle tråd flytte fra ventekøen til klarkøen, og så tager det lidt tid at blive plukket af CPU'en og køre.
Implicit Vent()
- Denne metode beder webdriver om at vente, hvis elementet ikke er tilgængeligt med det samme, men denne ventetid vil være på plads, så længe browseren er åben. Så enhver søgning efter elementerne på siden kan tage den tid, den implicitte ventetid er indstillet til.
Eksplicit Vent()
- Eksplicit ventetid bruges til at fastfryse testudførelsen indtil det tidspunkt, hvor en bestemt betingelse er opfyldt, eller den maksimale tid udløber.
WebdriverVent
- Det kan bruges til alle forhold. Dette kan opnås med WebDriverWait i kombination med ExpectedCondition
- Den bedste måde at vente på et element dynamisk er at tjekke for betingelsen hvert sekund og fortsætte til den næste kommando i scriptet, så snart betingelsen er opfyldt.
Men problemet med alle disse ventetider er, at du skal nævne timeout-enheden. Hvad hvis elementet stadig ikke er til stede inden for tiden? Så der er endnu en ventetid kaldet Fluent wait.
Flydende Vent
- Dette er en implementering af Wait-grænsefladen med sin timeout og polling-interval. Hver FluentWait-instans bestemmer den maksimale tid, der skal vente på en tilstand, såvel som den hyppighed, hvormed tilstanden skal kontrolleres.
Udfordringer med at håndtere Ajax Ring ind Selenium Webdriver
- Det er ikke helt pålideligt at bruge "pause"-kommandoen til at håndtere Ajax-opkald. Lang pausetid gør testen uacceptabelt langsom og øger Test tid. I stedet vil "waitforcondition" være mere nyttig til at teste Ajax-applikationer.
- Det er vanskeligt at vurdere risikoen forbundet med bestemte Ajax-applikationer
- Givet fuld frihed til udviklere til at ændre Ajax-applikationen gør testprocessen udfordrende
- At oprette en automatiseret testanmodning kan være vanskelig for testværktøjer, da en sådan AJAX-applikation ofte bruger forskellige kodnings- eller serialiseringsteknikker til at indsende POST-data.
Kodeeksempel for Ajax HÅNDTERING vha 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(); } }
Resumé
- AJAX tillader websiden at hente små mængder data fra serveren uden at genindlæse hele siden.
- For at teste Ajax-applikationen bør der anvendes forskellige ventemetoder
- TrådSøvn
- Implicit Vent
- Eksplicit Vent
- WebdriverVent
- Flydende Vent
- At oprette en automatiseret testanmodning kan være vanskelig for testværktøjer, da en sådan AJAX-applikation ofte bruger forskellige kodnings- eller serialiseringsteknikker til at indsende POST-data.