Come gestire le chiamate AJAX in entrata Selenium Webdriver

Cos'è l'Ajax?

AJAX sta per asincrono JavaScript e XML, e consente alla pagina Web di recuperare piccole quantità di dati dal server senza ricaricare l'intera pagina.

Ajax è una tecnica utilizzata per creare pagine web veloci e dinamiche. Questa tecnica è asincrona e utilizza una combinazione di Javascript e XML. Aggiornerà la/le parte/i di una pagina web senza ricaricare l'intera pagina. Alcune delle applicazioni famose che utilizzano la tecnica AJAX sono Gmail, Google Maps, Facebook, Youtube, ecc.

Come funziona l'Ajax?

Ad esempio, quando fai clic sul pulsante di invio, JavaCopione farà una richiesta al server, interpreterà il risultato e aggiornerà la schermata corrente senza ricaricare la pagina web.

Come funziona l'Ajax

  • Una chiamata Ajax è una richiesta asincrona avviata dal browser che non determina direttamente una transizione di pagina. Ciò significa che se si attiva una richiesta Ajax, l'utente può comunque lavorare sull'applicazione mentre la richiesta è in attesa di una risposta.
  • AJAX invia richieste HTTP dal client al server e quindi elabora la risposta del server, senza ricaricare l'intera pagina. Quindi, quando effettui una chiamata AJAX, tu non sono abbastanza sicuro del tempo impiegato dal server per inviarti una risposta.

Dal punto di vista del tester, se stai controllando il contenuto o l'elemento da visualizzare, devi aspettare di ricevere la risposta. Durante la chiamata AJAX i dati vengono archiviati in formato XML e recuperati dal server.

Come gestire le chiamate Ajax in entrata Selenium Webdriver

Il La sfida più grande nella gestione delle chiamate Ajax è conoscere il tempo di caricamento della pagina web. Poiché il caricamento della pagina web durerà solo una frazione di secondi, è difficile per il tester testare tale applicazione tramite lo strumento di automazione. Per quello, Selenium Webdriver deve utilizzare il metodo di attesa su questa chiamata Ajax.

Quindi eseguendo questo comando di attesa, il selenio sospenderà l'esecuzione di current Test Case e attendere il valore previsto o nuovo. Quando viene visualizzato il nuovo valore o campo, i test case sospesi verranno eseguiti da Selenium Webdriver.

Di seguito sono riportati i metodi di attesa che Selenium Webdriver può utilizzare

Discussione.Sonno()

  • Thread.Sleep() non è una scelta saggia poiché sospende il thread corrente per il periodo di tempo specificato.
  • In AJAX non puoi mai essere sicuro del tempo di attesa esatto. Pertanto, il test fallirà se l'elemento non verrà visualizzato entro il tempo di attesa. Inoltre, aumenta l'overhead perché la chiamata a Thread.sleep(t) fa sì che il thread corrente venga spostato dalla coda in esecuzione alla coda di attesa.
  • Una volta raggiunto il tempo t, il thread corrente si sposterà dalla coda di attesa alla coda di pronto, quindi ci vorrà del tempo per essere selezionato dalla CPU ed essere in esecuzione.

Attesa implicita()

  • Questo metodo dice al webdriver di attendere se l'elemento non è immediatamente disponibile, ma questa attesa durerà per tutto il tempo in cui il browser è aperto. Quindi qualsiasi ricerca degli elementi nella pagina potrebbe richiedere il tempo per cui è impostata l'attesa implicita.

Attesa esplicita()

  • Attesa esplicita viene utilizzato per congelare l'esecuzione del test fino al momento in cui viene soddisfatta una particolare condizione o allo scadere del tempo massimo.

WebdriverAspetta

  • Può essere utilizzato per qualsiasi condizione. Ciò può essere ottenuto con WebDriverWait in combinazione con ExpectedCondition
  • Il modo migliore per attendere dinamicamente un elemento è verificare la condizione ogni secondo e continuare con il comando successivo nello script non appena la condizione viene soddisfatta.

Ma il problema con tutte queste attese è che devi menzionare l'unità di timeout. Cosa succede se l'elemento non è ancora presente entro il tempo? Quindi c'è un'altra attesa chiamata Fluent wait.

Aspetta fluente

  • Questa è un'implementazione dell'interfaccia Wait con timeout e intervallo di polling. Ogni istanza FluentWait determina il tempo massimo di attesa per una condizione, nonché la frequenza con cui verificare la condizione.

Sfide nella gestione delle chiamate Ajax Selenium Webdriver

  • L'uso del comando "pause" per gestire le chiamate Ajax non è completamente affidabile. Un lungo tempo di pausa rende il test inaccettabilmente lento e aumenta la Testing tempo. Invece, "waitforcondition" sarà più utile nel testare le applicazioni Ajax.
  • È difficile valutare il rischio associato a particolari applicazioni Ajax
  • La piena libertà degli sviluppatori di modificare l'applicazione Ajax rende il processo di test impegnativo
  • La creazione di richieste di test automatizzate può essere difficile per gli strumenti di test poiché tali applicazioni AJAX spesso utilizzano tecniche di codifica o serializzazione diverse per inviare dati POST.

Esempio di codice per l'utilizzo di Ajax HANDLING 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();
	}
	
}

Sommario

  • AJAX consente alla pagina Web di recuperare piccole quantità di dati dal server senza ricaricare l'intera pagina.
  • Per testare l'applicazione Ajax, dovrebbero essere applicati diversi metodi di attesa
    • ThreadSleep
    • Attesa implicita
    • Aspetta esplicita
    • WebdriverAspetta
    • Aspetta fluente
  • La creazione di richieste di test automatizzate può essere difficile per gli strumenti di test poiché tali applicazioni AJAX spesso utilizzano tecniche di codifica o serializzazione diverse per inviare dati POST.