Как да обработваме AJAX повиквания Selenium Уебдрайвер

⚡ Умно обобщение

AJAX извикванията актуализират част от страницата без презареждане, така че Selenium WebDriver трябва да изчака новото съдържание, вместо да приема, че то е налично, а стратегията за изчакване решава дали тестът ще премине надеждно.

  • 🔘 Определение: AJAX извлича малки количества данни асинхронно и обновява само част от страницата.
  • ☑️ Основен проблем: Времето за отговор на сървъра е неизвестно, така че елементът може да не съществува, когато WebDriver го търси.
  • ✅ Опции за изчакване: Thread.sleep, имплицитно изчакване, експлицитно изчакване, WebDriverWait и FluentWait се държат по различен начин.
  • 🧪 Препоръчва се: WebDriverWait с ExpectedCondition проверява, докато се появи AJAX резултат, след което продължава веднага.
  • 🛠️ FluentWait: Добавя интервал на запитване и може да игнорира избрани изключения между опитите.
  • ⚠️ Selenium 4: Времето за изчакване вече е с продължителност и Selenium Мениджърът премахва пътя за ръчен драйвер.

Как да се обработват AJAX повиквания в Selenium уебдрайвер

Какво е AJAX?

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

AJAX е техника за изграждане на бързи, динамични уеб страници. Тя е асинхронна, комбинира JavaСценарий с формат на данни и актуализира части от страницата, вместо цялата страница. Gmail, Google Карти, Facebook и YouTube всички го използват.

Как работи AJAX?

Например, когато щракнете върху бутон за изпращане, JavaСкриптът изпраща заявка към сървъра, интерпретира резултата и актуализира текущия екран без презареждане. Диаграмата по-долу показва този обмен.

Диаграма на AJAX повикване между браузър и сървър без пълно презареждане на страницата

  • AJAX извикването е асинхронна заявка от браузъра, която не предизвиква преход между страници. Потребителят може да продължи да работи върху приложението, докато заявката чака отговор.
  • AJAX изпраща HTTP заявки към сървъра и обработва отговора, без да презарежда страницата, така че не можете да предвидите колко време ще отнеме на сървъра да отговори.

От гледна точка на тестера, проверката на съдържание или елемент означава чакане, докато пристигне отговорът. Полезният товар първоначално е бил XML, както подсказва името; повечето API-та сега връщат JSON.

Как да обработваме AJAX повиквания Selenium уебдрайвер

Най-голямото предизвикателство при обработката на AJAX повикване е познаването на времето за зареждане. Тъй като актуализацията трае части от секундата, приложението е трудно за тестване чрез инструмент за автоматизация, така че Selenium WebDriver трябва да приложи метод за изчакване към повикването.

Изпълнението на тази команда за изчакване спира текущото Тестов случай докато се появи очакваната или новата стойност; Selenium След това WebDriver възобновява прекъснатите стъпки.

Следват методите за изчакване, които Selenium WebDriver може да използва

Thread.sleep()

  • Thread.sleep () не е разумен избор, тъй като спира текущата нишка за зададения период от време.
  • В AJAX никога не можете да сте сигурни за точното време на изчакване, така че тестът се проваля, ако елементът не се появява в него. Това също така добавя режийни разходи, защото Thread.sleep(t) премества текущата нишка от изпълняващата се опашка в чакащата опашка.
  • След време 't' нишката се премества в опашката за готовност и след това отново чака да бъде поета от процесора.

Забележка: - Java методът е Thread.sleep() с малки букви; формата с главни букви не се компилира.

Неявно изчакване ()

  • Този метод указва на WebDriver да изчака, когато даден елемент не е наличен веднага, и настройката остава в сила за цялата сесия на браузъра. Следователно всяко търсене на елемент може да отнеме толкова време, колкото позволява имплицитното изчакване.

Изрично изчакване ()

  • Изрично изчакване се използва за замразяване на изпълнението на теста до момента, в който определено условие е изпълнено или изтече максималното време.

WebDriverWait

  • Може да се използва за всяко условие, като се комбинира WebDriverWait с ExpectedCondition.
  • Най-добрият подход е да се проверява условието всяка секунда и да се премине към следващата команда веднага щом то е изпълнено.

Но проблемът с всички тези чакания е, че трябва да споменете единицата за изчакване. Ами ако елементът все още не присъства в рамките на времето? Така че има още едно чакане, наречено Fluent wait.

Свободно изчакайте

  • Това е имплементация на интерфейса Wait със собствено време за изчакване и интервал на запитване. Всеки екземпляр на FluentWait задава максималното време за изчакване на условие и колко често да се проверява.

Предизвикателства при обработката на AJAX повиквания Selenium уебдрайвер

  • Използването на командата „пауза“ не е надеждно. Дългата пауза прави теста неприемливо бавен и увеличава Тестване време, така че вместо това за AJAX приложения беше препоръчано „waitforcondition“.
  • Трудно е да се оцени рискът, свързан с конкретни AJAX приложения.
  • Даването на пълна свобода на разработчиците да променят AJAX приложение прави процеса на тестване труден
  • Създаването на автоматизирана заявка за тест може да бъде трудно за инструментите за тестване, тъй като AJAX приложенията често използват различна техника за кодиране или сериализация, за да изпращат POST данни.

Забележка: „пауза“ и „изчакване на условие“ са Селенски команди, премахнати в Selenium 3; еквивалентът на WebDriver е изрично изчакване.

Code Пример за AJAX обработка с помощта на Selenium уебдрайвер

- TestNG Класът по-долу чете текста, щраква върху радио бутона, изчаква AJAX отговора и потвърждава, че текстът се е променил.

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

Забележка: on Selenium 4 пропуск Продължителност.наСекунди(5) към WebDriverWait и премахнете реда System.setProperty, защото Selenium Мениджърът разрешава chromedriver.

Въпроси и Отговори

Не. Конструкторите int и long бяха премахнати. Вместо това предайте Duration.ofSeconds(5) и използвайте Duration за implicitlyWait, pageLoadTimeout и всяка настройка на FluentWait.

Използвайте ExpectedConditions.invisibilityOfElementLocated с локатора на въртящия се елемент. Чакането само за целевия елемент често е твърде рано, докато наслагването все още блокира кликването.

Изпълнете скрипта return jQuery.active == 0 вътре в блок wait until. Той отчита нула само когато все още няма отворена jQuery заявка.

AJAX отговорът замени DOM възела, към който сочеше вашият WebElement. Намерете елемента отново след изчакването, вместо да използвате повторно по-ранната препратка.

Моделите с изкуствен интелект изучават типичните времена за реакция, за да настройват чаканията за всеки елемент, да маркират периодични, а не истински повреди, и да ги групират, така че една от основните причини да бъде отстранена веднъж.

Да. Копилот на GitHub създава блокове WebDriverWait и FluentWait от коментар, но потвърждава, че ExpectedCondition съответства на действителното поведение на страницата.

Не. Selenium Документацията предупреждава, че смесването им води до непредсказуеми изчаквания. Поддържайте имплицитното изчакване на нула и разчитайте на експлицитно изчакване.

Не оттогава Selenium 4.6. Selenium Мениджърът изтегля и конфигурира съответстващ драйвер, така че редът е необходим само за закрепване на локален двоичен файл на драйвера.

Обобщете тази публикация с: