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