Comment gérer les appels AJAX Selenium Pilote Web
⚡ Résumé intelligent
Les appels AJAX mettent à jour une partie d'une page sans rechargement, donc Selenium WebDriver doit attendre le nouveau contenu au lieu de supposer qu'il est présent, et la stratégie d'attente détermine si le test réussit de manière fiable.
Qu'est-ce qu'AJAX ?
AJAX signifie Asynchrone JavaScript et XML, et cela permet à la page Web de récupérer de petites quantités de données du serveur sans recharger la page entière.
AJAX est une technique permettant de créer des pages web rapides et dynamiques. Elle est asynchrone et combine… Javascénario avec un format de données, et met à jour des parties d'une page au lieu de la page entière. Gmail, Google Cartes, Facebook et YouTube Tous l'utilisent.
Comment fonctionne AJAX ?
Par exemple, lorsque vous cliquez sur un bouton de soumission, JavaLe script envoie une requête au serveur, interprète le résultat et met à jour l'écran actuel sans rechargement. Le schéma ci-dessous illustre cet échange.
- Un appel AJAX est une requête asynchrone envoyée par le navigateur qui n'entraîne pas de changement de page. L'utilisateur peut continuer à utiliser l'application pendant que la requête attend une réponse.
- AJAX envoie des requêtes HTTP au serveur et traite la réponse sans recharger la page ; il est donc impossible de prévoir le temps de réponse du serveur.
Du point de vue d'un testeur, vérifier un contenu ou un élément implique d'attendre la réponse. La charge utile était initialement au format XML, comme son nom l'indique ; la plupart des API renvoient désormais du JSON.
Comment gérer les appels AJAX Selenium pilote web
Le principal défi lié à la gestion d'un appel AJAX est la connaissance du temps de chargement. Étant donné que la mise à jour ne dure qu'une fraction de seconde, l'application est difficile à tester à l'aide d'un outil d'automatisation. Selenium WebDriver doit appliquer une méthode d'attente à l'appel.
L'exécution de cette commande d'attente suspend le processus en cours. Cas de test jusqu'à ce que la valeur attendue ou nouvelle apparaisse ; Selenium WebDriver reprend ensuite les étapes suspendues.
Voici les méthodes d'attente qui Selenium WebDriver peut utiliser
Thread.sommeil()
- Thread.sleep() n'est pas un choix judicieux car il suspend le thread actuel pendant la durée spécifiée.
- En AJAX, le temps d'attente exact est imprévisible ; le test échoue donc si l'élément n'apparaît pas dans le délai imparti. De plus, cela engendre une surcharge, car `Thread.sleep(t)` déplace le thread courant de la file d'attente d'exécution vers la file d'attente d'attente.
- Après un temps 't', le thread passe dans la file d'attente des tâches prêtes, puis attend à nouveau d'être pris en charge par le processeur.
À noter: le Java la méthode est Thread.sommeil() en minuscules ; la forme avec majuscules ne compile pas.
Attente implicite()
- Cette méthode indique à WebDriver d'attendre lorsqu'un élément n'est pas immédiatement disponible, et ce paramètre reste actif pendant toute la durée de la session de navigation. La recherche de chaque élément peut donc prendre autant de temps que le permet cette attente implicite.
Attente explicite()
- Attente explicite est utilisé pour geler l’exécution du test jusqu’au moment où une condition particulière est remplie ou jusqu’à l’expiration du délai maximum.
WebDriverAttendez
- Il peut être utilisé pour n'importe quelle condition, en combinant WebDriverWait avec un ExpectedCondition.
- La meilleure solution consiste à vérifier la condition chaque seconde et à passer à la commande suivante dès qu'elle est remplie.
Mais le problème avec toutes ces attentes, c'est qu'il faut mentionner l'unité de temps mort. Que se passe-t-il si l'élément n'est toujours pas présent dans le délai imparti ? Il y a donc une autre attente appelée Fluent wait.
Attente fluide
- Il s'agit d'une implémentation de l'interface Wait, dotée de son propre délai d'attente et de son intervalle d'interrogation. Chaque instance de FluentWait définit la durée maximale d'attente d'une condition et la fréquence de vérification.
Défis liés à la gestion des appels AJAX Selenium pilote web
- L'utilisation de la commande « pause » n'est pas fiable. Une pause trop longue ralentit excessivement le test et augmente les risques. Tests Par conséquent, « waitforcondition » a été recommandé pour les applications AJAX.
- Il est difficile d'évaluer le risque associé à certaines applications AJAX.
- Donner aux développeurs une liberté totale pour modifier une application AJAX rend le processus de test complexe.
- Créer une requête de test automatisée peut s'avérer difficile pour les outils de test, car les applications AJAX utilisent souvent une technique d'encodage ou de sérialisation différente pour soumettre des données POST.
À noter: « pause » et « waitforcondition » sont Sélénèse commandes supprimées dans Selenium 3 ; l'équivalent WebDriver est une attente explicite.
Code Exemple de gestion AJAX utilisant Selenium pilote web
Le TestNG La classe ci-dessous lit le texte, clique sur le bouton radio, attend la réponse AJAX et vérifie que le texte a changé.
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(); } }
À noter: on Selenium passe 4 Durée.deSecondes(5) pour WebDriverWait et supprimer la ligne System.setProperty, car Selenium Le gestionnaire résout le problème de chromedriver.

