Comment gérer les appels AJAX Selenium Pilote Web

Qu'est-ce qu'Ajax ?

AJAX signifie asynchrones 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 utilisée pour créer des pages Web rapides et dynamiques. Cette technique est asynchrone et utilise une combinaison de Javascript et XML. Il mettra à jour une ou plusieurs parties d'une page Web sans recharger la page entière. Certaines des applications célèbres qui utilisent la technique AJAX sont Gmail, Google Maps, Facebook, Youtube, etc.

Comment fonctionne Ajax ?

Par exemple, lorsque vous cliquez sur le bouton Soumettre, Javascénario fera une requête au serveur, interprétera le résultat et mettra à jour l’écran actuel sans recharger la page Web.

Comment fonctionne Ajax

  • Un appel Ajax est une requête asynchrone initiée par le navigateur qui n'entraîne pas directement une transition de page. Cela signifie que si vous lancez une requête Ajax, l'utilisateur peut toujours travailler sur l'application pendant que la requête attend une réponse.
  • AJAX envoie des requêtes HTTP du client au serveur, puis traite la réponse du serveur, sans recharger la page entière. Ainsi, lorsque vous effectuez un appel AJAX, vous vous n'êtes pas sûr du temps mis par le serveur pour vous envoyer une réponse.

Du point de vue d'un testeur, si vous vérifiez le contenu ou l'élément à afficher, vous devez attendre d'avoir la réponse. Lors de l'appel AJAX, les données sont stockées au format XML et récupérées du serveur.

Comment gérer les appels Ajax Selenium Pilote Web

La série Le plus grand défi dans la gestion des appels Ajax est de connaître le temps de chargement de la page Web. Étant donné que le chargement de la page Web ne dure qu’une fraction de seconde, il est difficile pour le testeur de tester une telle application via un outil d’automatisation. Pour ça, Selenium Webdriver doit utiliser la méthode d'attente sur cet appel Ajax.

Ainsi, en exécutant cette commande d'attente, Selenium suspendra l'exécution du courant Cas de test et attendez la valeur attendue ou nouvelle. Lorsque la nouvelle valeur ou le nouveau champ apparaît, les cas de test suspendus seront exécutés par Selenium Pilote Web.

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 en cours pendant la durée spécifiée.
  • En AJAX, vous ne pouvez jamais être sûr du temps d'attente exact. Ainsi, votre test échouera si l'élément n'apparaît pas dans le temps d'attente. De plus, cela augmente la surcharge car l'appel de Thread.sleep(t) déplace le thread actuel de la file d'attente en cours d'exécution vers la file d'attente.
  • Une fois le temps « t » atteint, le thread actuel passera de la file d'attente à la file d'attente prête, puis il faudra un certain temps pour être sélectionné par le processeur et être exécuté.

Attente implicite()

  • Cette méthode indique à webdriver d'attendre si l'élément n'est pas disponible immédiatement, mais cette attente sera en place pendant toute la durée d'ouverture du navigateur. Ainsi, toute recherche d’éléments sur la page pourrait prendre le temps prévu pour l’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é dans toutes les conditions. Ceci peut être réalisé avec WebDriverWait en combinaison avec ExpectedCondition
  • La meilleure façon d'attendre un élément de manière dynamique est de vérifier la condition toutes les secondes et de passer à la commande suivante du script dès que la condition 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 ayant son délai d'attente et son intervalle d'interrogation. Chaque instance FluentWait détermine la durée maximale d'attente pour une condition, ainsi que la fréquence à laquelle vérifier la condition.

Défis liés à la gestion des appels Ajax Selenium Pilote Web

  • L'utilisation de la commande « pause » pour gérer les appels Ajax n'est pas totalement fiable. Un temps de pause long ralentit le test de manière inacceptable et augmente le temps de pause. Contrôle de qualité temps. Au lieu de cela, « waitforcondition » sera plus utile pour tester les applications Ajax.
  • Il est difficile d'évaluer le risque associé à des applications Ajax particulières
  • La liberté totale accordée aux développeurs de modifier l'application Ajax rend le processus de test difficile.
  • La création d'une demande de test automatisée peut être difficile pour les outils de test, car ces applications AJAX utilisent souvent différentes techniques d'encodage ou de sérialisation pour soumettre les données POST.

Exemple de code pour Ajax HANDLING utilisant Selenium Pilote Web

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();
	}
	
}

Résumé

  • AJAX permet à la page Web de récupérer de petites quantités de données du serveur sans recharger la page entière.
  • Pour tester l'application Ajax, différentes méthodes d'attente doivent être appliquées
    • DiscussionSommeil
    • Attente implicite
    • Attente explicite
    • WebdriverAttendez
    • Attente fluide
  • La création d'une demande de test automatisée peut être difficile pour les outils de test, car ces applications AJAX utilisent souvent différentes techniques d'encodage ou de sérialisation pour soumettre les données POST.