Как да обработваме AJAX повиквания Selenium Уебдрайвер
⚡ Умно обобщение
AJAX извикванията актуализират част от страницата без презареждане, така че Selenium WebDriver трябва да изчака новото съдържание, вместо да приема, че то е налично, а стратегията за изчакване решава дали тестът ще премине надеждно.
Какво е AJAX?
AJAX означава Асинхронен JavaСкрипт и XML и позволява на уеб страницата да извлича малки количества данни от сървъра, без да презарежда цялата страница.
AJAX е техника за изграждане на бързи, динамични уеб страници. Тя е асинхронна, комбинира JavaСценарий с формат на данни и актуализира части от страницата, вместо цялата страница. Gmail, Google Карти, Facebook и YouTube всички го използват.
Как работи AJAX?
Например, когато щракнете върху бутон за изпращане, JavaСкриптът изпраща заявка към сървъра, интерпретира резултата и актуализира текущия екран без презареждане. Диаграмата по-долу показва този обмен.
- 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.

