Как обрабатывать вызовы AJAX в Selenium Вебдрайвер

Что такое Аякс?

AJAX означает Асинхронный JavaСкрипт и XML, и это позволяет веб-странице получать небольшие объемы данных с сервера без перезагрузки всей страницы.

Ajax — это метод, используемый для создания быстрых и динамичных веб-страниц. Этот метод асинхронный и использует комбинацию Javascript и XML. Он обновит часть/части веб-страницы без перезагрузки всей страницы. Некоторые из известных приложений, использующих технику AJAX, — это Gmail, Google Maps, Facebook, Youtube и т. д.

Как работает Аякс?

Например, когда вы нажимаете кнопку «Отправить», JavaСценарий сделает запрос к серверу, интерпретирует результат и обновит текущий экран без перезагрузки веб-страницы.

Как работает Аякс

  • Вызов Ajax — это асинхронный запрос, инициируемый браузером, который не приводит напрямую к переходу страницы. Это означает, что если вы отправляете запрос Ajax, пользователь все равно может работать с приложением, пока запрос ожидает ответа.
  • AJAX отправляет HTTP-запросы от клиента на сервер, а затем обрабатывает ответ сервера без перезагрузки всей страницы. Итак, когда вы делаете вызов AJAX, вы не совсем уверены в том, сколько времени потребуется серверу на отправку вам ответа.

С точки зрения тестировщика, если вы проверяете контент или отображаемый элемент, вам нужно подождать, пока вы не получите ответ. Во время вызова AJAX данные сохраняются в формате XML и извлекаются с сервера.

Как обрабатывать вызовы Ajax в Selenium Вебдрайвер

Команда Самая большая проблема при обработке вызовов Ajax — это знание времени загрузки веб-страницы. Поскольку загрузка веб-страницы будет длиться всего лишь доли секунды, тестировщику сложно протестировать такое приложение с помощью средства автоматизации. Для этого, Selenium Webdriver должен использовать метод ожидания для этого вызова Ajax.

Таким образом, выполнив эту команду ожидания, селен приостановит выполнение текущего Тестовый кейс и дождитесь ожидаемого или нового значения. Когда появится новое значение или поле, приостановленные тестовые примеры будут выполнены Selenium Вебдрайвер.

Ниже приведены методы ожидания, которые Selenium Вебдрайвер может использовать

Thread.Sleep ()

  • Thread.Sleep() не является разумным выбором, поскольку он приостанавливает текущий поток на указанное время.
  • В AJAX вы никогда не можете быть уверены в точном времени ожидания. Таким образом, ваш тест завершится неудачей, если элемент не появится в течение времени ожидания. Более того, это увеличивает накладные расходы, поскольку вызов Thread.sleep(t) приводит к перемещению текущего потока из текущей очереди в очередь ожидания.
  • По истечении времени t текущий поток переместится из очереди ожидания в очередь готовности, а затем потребуется некоторое время, чтобы ЦП выбрал его и запустил.

Неявное ожидание()

  • Этот метод сообщает веб-драйверу подождать, если элемент недоступен немедленно, но это ожидание будет действовать в течение всего времени, пока браузер открыт. Таким образом, любой поиск элементов на странице может занять время, установленное для неявного ожидания.

Явное ожидание()

  • Явное ожидание используется для приостановки выполнения теста до тех пор, пока не будет выполнено определенное условие или не пройдет максимальное время.

WebdriverПодождите

  • Его можно использовать в любых условиях. Этого можно достичь с помощью WebDriverWait в сочетании с ExpectedCondition.
  • Лучший способ динамического ожидания элемента — проверять условие каждую секунду и переходить к следующей команде сценария, как только условие будет выполнено.

Но проблема со всеми этими ожиданиями в том, что вы должны упомянуть единицу времени ожидания. Что, если элемент все еще не присутствует в течение времени? Итак, есть еще одно ожидание под названием «Свободное ожидание».

Свободное ожидание

  • Это реализация интерфейса ожидания, имеющего свой тайм-аут и интервал опроса. Каждый экземпляр FluentWait определяет максимальное время ожидания условия, а также частоту проверки условия.

Проблемы при обработке вызовов Ajax Selenium Вебдрайвер

  • Использование команды «пауза» для обработки вызова Ajax не совсем надежно. Длительная пауза делает тест неприемлемо медленным и увеличивает время Тестирование время. Вместо этого «waitforcondition» будет более полезным при тестировании приложений Ajax.
  • Трудно оценить риск, связанный с конкретными приложениями Ajax.
  • Полная свобода разработчиков модифицировать приложение Ajax усложняет процесс тестирования.
  • Создание автоматизированного тестового запроса может оказаться затруднительным для инструментов тестирования, поскольку такие приложения AJAX часто используют разные методы кодирования или сериализации для отправки данных POST.

Пример кода для ОБРАБОТКИ Ajax с использованием 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
    • Неявное ожидание
    • Явное ожидание
    • WebdriverПодождите
    • Свободное ожидание
  • Создание автоматизированного тестового запроса может оказаться затруднительным для инструментов тестирования, поскольку такие приложения AJAX часто используют разные методы кодирования или сериализации для отправки данных POST.