Як обробляти виклики AJAX Selenium Веб-драйвер

Що таке Ajax?

AJAX означає Асинхронний JavaСценарій і XML, і це дозволяє веб-сторінці отримувати невеликі обсяги даних із сервера без перезавантаження всієї сторінки.

Ajax — це техніка, яка використовується для створення швидких і динамічних веб-сторінок. Цей метод є асинхронним і використовує комбінацію Javascript та XML. Він оновить частину веб-сторінки без перезавантаження всієї сторінки. Деякі з відомих програм, які використовують техніку AJAX, це Gmail, Google Maps, Facebook, Youtube тощо.

Як працює Ajax?

Наприклад, коли ви натискаєте кнопку «Надіслати», JavaScript зробить запит до сервера, інтерпретує результат і оновить поточний екран без перезавантаження веб-сторінки.

Як працює Ajax

  • Виклик Ajax — це асинхронний запит, ініційований браузером, який безпосередньо не призводить до переходу сторінки. Це означає, що якщо ви запускаєте запит Ajax, користувач усе ще може працювати над програмою, поки запит очікує на відповідь.
  • AJAX надсилає HTTP-запити від клієнта до сервера, а потім обробляє відповідь сервера, не перезавантажуючи всю сторінку. Отже, коли ви робите виклик AJAX, ви не дуже впевнені щодо часу, який знадобився серверу для надсилання вам відповіді.

З точки зору тестувальника, якщо ви перевіряєте вміст або елемент, який має відображатися, вам потрібно зачекати, поки ви отримаєте відповідь. Під час виклику AJAX дані зберігаються у форматі XML і витягуються із сервера.

Як обробляти виклики Ajax Selenium Веб-драйвер

Команда Найбільша складність у обробці викликів Ajax полягає в тому, щоб знати час завантаження веб-сторінки. Оскільки завантаження веб-сторінки триватиме лише частку секунд, тестувальнику важко перевірити таку програму за допомогою інструменту автоматизації. Для того, Selenium Webdriver має використовувати метод очікування для цього виклику Ajax.

Отже, виконавши цю команду очікування, selenium призупинить виконання поточного Тестовий випадок і дочекайтеся очікуваного або нового значення. Коли з’явиться нове значення або поле, призупинені тестові приклади будуть виконані Selenium Веб-драйвер.

Нижче наведено методи очікування Selenium Webdriver можна використовувати

Thread.Sleep()

  • Thread.Sleep () не є мудрим вибором, оскільки він призупиняє поточний потік на вказаний проміжок часу.
  • В AJAX ви ніколи не можете бути впевнені щодо точного часу очікування. Отже, ваш тест буде невдалим, якщо елемент не з’явиться протягом часу очікування. Крім того, це збільшує накладні витрати, оскільки виклик Thread.sleep(t) переміщує поточний потік із черги виконання до черги очікування.
  • Після досягнення часу «t» поточний потік переміститься з черги очікування до черги готовності, а потім потрібен деякий час, щоб його вибрав ЦП і почав працювати.

Неявне очікування ()

  • Цей метод повідомляє webdriver чекати, якщо елемент не буде доступний негайно, але це очікування триватиме протягом усього часу, коли браузер відкрито. Отже, будь-який пошук елементів на сторінці може зайняти час, на який встановлено неявне очікування.

Явне очікування ()

  • Явне очікування використовується для заморожування виконання тесту до моменту виконання певної умови або закінчення максимального часу.

WebdriverWait

  • Його можна використовувати в будь-яких умовах. Цього можна досягти за допомогою WebDriverWait у поєднанні з ExpectedCondition
  • Найкращий спосіб динамічно чекати елемента — перевіряти умову щосекунди та переходити до наступної команди в сценарії, щойно умова буде виконана.

Але проблема з усіма цими очікуваннями полягає в тому, що ви повинні згадати одиницю тайм-ауту. Що робити, якщо елемент все ще відсутній протягом певного часу? Отже, є ще одне очікування під назвою Fluent wait.

Вільно зачекайте

  • Це реалізація інтерфейсу очікування, що має свій час очікування та інтервал опитування. Кожен екземпляр FluentWait визначає максимальний час очікування умови, а також частоту перевірки умови.

Складнощі обробки викликів Ajax Selenium Веб-драйвер

  • Використання команди «pause» для обробки виклику Ajax не є повністю надійним. Довга пауза робить тест неприпустимо повільним і збільшує Тестування час. Натомість «waitforcondition» буде більш корисним у тестуванні програм Ajax.
  • Важко оцінити ризик, пов’язаний з окремими програмами Ajax
  • Надання розробникам повної свободи модифікувати програму Ajax робить процес тестування складним
  • Створення автоматичного тестового запиту може бути складним для інструментів тестування, оскільки такі програми AJAX часто використовують різні методи кодування або серіалізації для надсилання даних POST.

Приклад коду для використання Ajax HANDLING Selenium Веб-драйвер

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

Підсумки

  • AJAX дозволяє веб-сторінці отримувати невеликі обсяги даних із сервера без перезавантаження всієї сторінки.
  • Щоб перевірити додаток Ajax, слід застосувати різні методи очікування
    • ThreadSleep
    • Неявне очікування
    • Явне очікування
    • WebdriverWait
    • Вільно зачекайте
  • Створення автоматичного тестового запиту може бути складним для інструментів тестування, оскільки такі програми AJAX часто використовують різні методи кодування або серіалізації для надсилання даних POST.