Come gestire le chiamate AJAX in entrata Selenium Webdriver
⚡ Riepilogo intelligente
Le chiamate AJAX aggiornano parte di una pagina senza ricaricarla, quindi Selenium WebDriver deve attendere il nuovo contenuto anziché presumere che sia già presente, e la strategia di attesa determina se il test viene superato in modo affidabile.

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 per la creazione di pagine web veloci e dinamiche. È asincrona e combina JavaCopione con un formato dati e aggiorna parti di una pagina anziché l'intera pagina. Gmail, Google Mappe, Facebook e YouTube lo usano tutti.
Come funziona AJAX?
Ad esempio, quando fai clic su un pulsante di invio, JavaLo script invia una richiesta al server, interpreta il risultato e aggiorna la schermata corrente senza ricaricare la pagina. Il diagramma seguente illustra questo scambio.
- Una chiamata AJAX è una richiesta asincrona proveniente dal browser che non provoca una transizione di pagina. L'utente può continuare a utilizzare l'applicazione mentre la richiesta è in attesa di una risposta.
- AJAX invia richieste HTTP al server ed elabora la risposta senza ricaricare la pagina, quindi non è possibile prevedere quanto tempo impiegherà il server a rispondere.
Dal punto di vista di un tester, verificare il contenuto o un elemento significa attendere l'arrivo della risposta. Il payload era originariamente in formato XML, come suggerisce il nome; la maggior parte delle API ora restituisce JSON.
Come gestire le chiamate AJAX in entrata Selenium webdriver
La sfida più grande nella gestione di una chiamata AJAX è conoscere il tempo di caricamento. Poiché l'aggiornamento dura una frazione di secondo, l'applicazione è difficile da testare tramite uno strumento di automazione, quindi Selenium WebDriver deve applicare un metodo di attesa alla chiamata.
L'esecuzione di quel comando di attesa sospende l'attuale Test Case fino a quando non compare il valore previsto o nuovo; Selenium WebDriver riprende quindi le fasi sospese.
Di seguito sono riportati i metodi di attesa che Selenium WebDriver può utilizzare
Discussione.sleep()
- Thread.sleep() non è una scelta saggia in quanto sospende il thread corrente per il periodo di tempo specificato.
- In AJAX non si può mai essere certi del tempo di attesa esatto, quindi il test fallisce se l'elemento non compare entro tale intervallo. Inoltre, introduce un overhead, perché Thread.sleep(t) sposta il thread corrente dalla coda di esecuzione alla coda di attesa.
- Trascorso un tempo 't', il thread si sposta nella coda dei thread pronti e quindi attende nuovamente di essere prelevato dalla CPU.
Nota: , il Java metodo è Discussione.sleep() in minuscolo; la forma con la prima lettera maiuscola non viene compilata.
Attesa implicita()
- Questo metodo indica a WebDriver di attendere quando un elemento non è immediatamente disponibile e l'impostazione rimane attiva per l'intera sessione del browser. Pertanto, ogni ricerca di elementi può richiedere tutto il tempo consentito dall'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.
WebDriverAttendi
- Può essere utilizzato per qualsiasi condizione, combinando WebDriverWait con un ExpectedCondition.
- L'approccio migliore è quello di verificare la condizione ogni secondo e passare al comando successivo non appena questa 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 il proprio timeout e intervallo di polling. Ogni istanza di FluentWait imposta il tempo massimo di attesa per una condizione e la frequenza con cui verificarla.
Sfide nella gestione delle chiamate AJAX Selenium webdriver
- L'utilizzo del comando "pausa" non è affidabile. Una pausa prolungata rende il test inaccettabilmente lento e aumenta Collaudo tempo, quindi "waitforcondition" è stato raccomandato per le applicazioni AJAX.
- È difficile valutare il rischio associato a specifiche applicazioni AJAX.
- Concedere agli sviluppatori la piena libertà di modificare un'applicazione AJAX rende il processo di test più complesso
- Creare una richiesta di test automatizzata può essere difficile per gli strumenti di test, perché le applicazioni AJAX spesso utilizzano una tecnica di codifica o serializzazione diversa per inviare i dati POST.
Nota: “pause” e “waitforcondition” sono Selenese comandi rimossi in Selenium 3; l'equivalente in WebDriver è un'attesa esplicita.
Code Esempio di gestione AJAX tramite Selenium webdriver
Migliori TestNG La classe seguente legge il testo, fa clic sul pulsante di opzione, attende la risposta AJAX e verifica che il testo sia cambiato.
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(); } }
Nota: on Selenium passaggio 4 Durata.inSecondi(5) a WebDriverWait e rilascia la riga System.setProperty, perché Selenium Il gestore risolve il problema di chromedriver.

