Как обрабатывать вызовы 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.

Подведем итог этой публикации следующим образом: