Hoe u AJAX-oproepen kunt afhandelen Selenium Webstuurprogramma
Wat is Ajax?
AJAX staat voor Asynchronous JavaScript en XML, en het stelt de webpagina in staat kleine hoeveelheden gegevens van de server op te halen zonder de hele pagina opnieuw te laden.
Ajax is een techniek die gebruikt wordt om snelle en dynamische webpagina's te maken. Deze techniek is asynchroon en gebruikt een combinatie van Javascript en XML. Het zal de delen van een webpagina updaten zonder de hele pagina opnieuw te laden. Enkele van de bekende applicaties die de AJAX-techniek gebruiken zijn Gmail, Google Maps, Facebook, Youtube, etc.
Hoe Ajax werkt?
Wanneer u bijvoorbeeld op de knop Verzenden klikt, JavaScript zal een verzoek indienen bij de server, het resultaat interpreteren en het huidige scherm bijwerken zonder de webpagina opnieuw te laden.
- Een Ajax-oproep is een asynchroon verzoek dat door de browser wordt geïnitieerd en niet direct resulteert in een paginaovergang. Dit betekent dat als u een Ajax-verzoek afvuurt, de gebruiker nog steeds aan de applicatie kan werken terwijl het verzoek wacht op een reactie.
- AJAX verzendt HTTP-verzoeken van de client naar de server en verwerkt vervolgens het antwoord van de server, zonder de hele pagina opnieuw te laden. Wanneer u dus met AJAX belt, kunt u zijn niet helemaal zeker van de tijd die de server nodig heeft om u een antwoord te sturen.
Vanuit het oogpunt van een tester, als u de inhoud of het weer te geven element controleert, moet u wachten tot u het antwoord krijgt. Tijdens de AJAX-aanroep worden de gegevens opgeslagen in XML-formaat en opgehaald van de server.
Hoe u Ajax-oproepen kunt afhandelen Selenium Webstuurprogramma
De De grootste uitdaging bij het verwerken van Ajax-oproepen is het weten van de laadtijd voor de webpagina. Omdat het laden van de webpagina slechts een fractie van een seconde duurt, is het voor de tester moeilijk om een dergelijke applicatie te testen via een automatiseringstool. Daarom, Selenium Webdriver moet de wachtmethode gebruiken voor deze Ajax-oproep.
Door deze wait-opdracht uit te voeren, zal Selenium de uitvoering van de huidige opdracht onderbreken. Testgeval en wacht op de verwachte of nieuwe waarde. Wanneer de nieuwe waarde of het nieuwe veld verschijnt, worden de opgeschorte testgevallen uitgevoerd Selenium Webdriver.
Hieronder staan de wachtmethoden die Selenium Webdriver kunt gebruiken
Draad.Sleep()
- Thread.Sleep() is geen verstandige keuze omdat het de huidige thread gedurende de opgegeven tijdsduur onderbreekt.
- Bij AJAX weet je nooit zeker wat de exacte wachttijd is. Uw test mislukt dus als het element niet binnen de wachttijd verschijnt. Bovendien verhoogt het de overhead omdat het aanroepen van Thread.sleep(t) ervoor zorgt dat de huidige thread van de lopende wachtrij naar de wachtende wachtrij wordt verplaatst.
- Nadat de tijd 't' is bereikt, wordt de huidige thread van de wachtrij naar de gereed-wachtrij verplaatst, waarna het enige tijd duurt voordat deze door de CPU wordt opgepikt en wordt uitgevoerd.
Impliciet wachten()
- Deze methode vertelt de webdriver dat hij moet wachten als het element niet onmiddellijk beschikbaar is, maar deze wachttijd blijft gelden gedurende de hele tijd dat de browser geopend is. Elke zoekopdracht naar de elementen op de pagina kan dus de tijd in beslag nemen waarvoor de impliciete wachttijd is ingesteld.
Expliciet wachten()
- Expliciet wachten wordt gebruikt om de testuitvoering te bevriezen tot het moment dat aan een bepaalde voorwaarde is voldaan of de maximale tijd is verstreken.
WebdriverWacht
- Het kan voor alle omstandigheden worden gebruikt. Dit kan worden bereikt met WebDriverWait in combinatie met ExpectedCondition
- De beste manier om dynamisch op een element te wachten, is door elke seconde op de voorwaarde te controleren en door te gaan naar de volgende opdracht in het script zodra aan de voorwaarde is voldaan.
Maar het probleem met al dit wachten is dat je de time-out-eenheid moet vermelden. Wat als het element binnen de tijd nog steeds niet aanwezig is? Er is dus nog een wachttijd genaamd Vloeiend wachten.
Vloeiend wachten
- Dit is een implementatie van de Wait-interface met een time-out en polling-interval. Elke FluentWait-instantie bepaalt de maximale hoeveelheid tijd die op een voorwaarde moet worden gewacht, evenals de frequentie waarmee de voorwaarde moet worden gecontroleerd.
Uitdagingen bij het omgaan met Ajax Meld u aan Selenium Webstuurprogramma
- Het gebruik van de opdracht "pauze" voor het afhandelen van een Ajax-oproep is niet volledig betrouwbaar. Een lange pauzetijd maakt de test onaanvaardbaar traag en verhoogt de Testen tijd. In plaats daarvan zal "waitforcondition" nuttiger zijn bij het testen van Ajax-applicaties.
- Het is moeilijk om het risico in te schatten dat aan bepaalde Ajax-toepassingen is verbonden
- Doordat ontwikkelaars de volledige vrijheid hebben om de Ajax-applicatie aan te passen, is het testproces een uitdaging
- Het maken van een geautomatiseerd testverzoek kan moeilijk zijn voor testtools, omdat AJAX-applicaties vaak verschillende coderings- of serialisatietechnieken gebruiken om POST-gegevens in te dienen.
Codevoorbeeld voor Ajax HANDLING met behulp van Selenium Webstuurprogramma
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(); } }
Samenvatting
- Met AJAX kan de webpagina kleine hoeveelheden gegevens van de server ophalen zonder de hele pagina opnieuw te laden.
- Om de Ajax-applicatie te testen, moeten verschillende wachtmethoden worden toegepast
- DraadSlaap
- Impliciete wachttijd
- Expliciete wachttijd
- WebdriverWacht
- Vloeiend wachten
- Het maken van een geautomatiseerd testverzoek kan moeilijk zijn voor testtools, omdat AJAX-applicaties vaak verschillende coderings- of serialisatietechnieken gebruiken om POST-gegevens in te dienen.