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.

  • 🔘 Definizione: AJAX recupera piccole quantità di dati in modo asincrono e aggiorna solo una parte della pagina.
  • ☑️ Problema centrale: Il tempo di risposta del server è sconosciuto, quindi l'elemento potrebbe non esistere quando WebDriver lo cerca.
  • Opzioni di attesa: Thread.sleep, implicit wait, explicit wait, WebDriverWait e FluentWait si comportano ciascuno in modo diverso.
  • 🧪 Consigliato: WebDriverWait con un ExpectedCondition esegue un polling finché non appare il risultato AJAX, quindi continua immediatamente.
  • FluentWait: Aggiunge un intervallo di polling e può ignorare le eccezioni selezionate tra un tentativo e l'altro.
  • ⚠️ Selenium 4: I timeout ora richiedono Durata e Selenium Il gestore rimuove il percorso del conducente manuale.

Come gestire le chiamate AJAX in 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 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.

Schema di una chiamata AJAX tra browser e server senza ricaricamento completo della pagina.

  • 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.

DOMANDE FREQUENTI

No. I costruttori int e long sono stati rimossi. Passa invece Duration.ofSeconds(5) e usa Duration per implicitlyWait, pageLoadTimeout e ogni impostazione di FluentWait.

Utilizza ExpectedConditions.invisibilityOfElementLocated con il localizzatore spinner. Attendere solo l'elemento di destinazione spesso avviene troppo presto, mentre la sovrapposizione blocca ancora il clic.

Esegui lo script `return jQuery.active == 0` all'interno di un blocco `wait until`. Restituisce zero solo quando non è ancora aperta alcuna richiesta jQuery.

La risposta AJAX ha sostituito il nodo DOM a cui puntava il tuo WebElement. Dopo l'attesa, individua nuovamente l'elemento anziché riutilizzare il riferimento precedente.

I modelli di intelligenza artificiale apprendono i tempi di risposta tipici per ottimizzare le attese per ciascun elemento, segnalano i guasti intermittenti anziché quelli reali e li raggruppano in modo che una singola causa principale venga risolta una volta per tutte.

Sì. Le serrature scorrevoli portatili e i catenacci a superficie possono essere usati per mettere in sicurezza una porta a scomparsa dall'esterno. Alcuni kit con catena di sicurezza consentono anche il bloccaggio esterno con chiave o manopola girevole. Copilota GitHub elabora i blocchi WebDriverWait e FluentWait da un commento, ma verifica che ExpectedCondition corrisponda al comportamento effettivo della pagina.

No. Selenium La documentazione avverte che la combinazione di questi due metodi causa timeout imprevedibili. Mantieni l'attesa implicita a zero e affidati alle attese esplicite.

Non da Selenium 4.6 Selenium Il gestore scarica e configura un driver corrispondente, quindi la riga è necessaria solo per specificare un file binario del driver locale.

Riassumi questo post con: