Как да обработваме AJAX повиквания Selenium Уебдрайвер
Какво е Ajax?
AJAX означава Asynchronous JavaСкрипт и XML, и позволява на уеб страницата да извлича малки количества данни от сървъра, без да презарежда цялата страница.
Ajax е техника, използвана за създаване на бързи и динамични уеб страници. Тази техника е асинхронна и използва комбинация от Javascript и XML. Той ще актуализира частта/ите от уеб страница, без да презарежда цялата страница. Някои от известните приложения, които използват техниката AJAX, са Gmail, Google Maps, Facebook, Youtube и др.
Как работи Ajax?
Например, когато щракнете върху бутона за изпращане, JavaСценарий ще отправи заявка към сървъра, ще интерпретира резултата и ще актуализира текущия екран, без да презарежда уеб страницата.
- Извикването на Ajax е асинхронна заявка, инициирана от браузъра, която не води директно до преход на страница. Това означава, че ако задействате Ajax заявка, потребителят все още може да работи върху приложението, докато заявката чака отговор.
- AJAX изпраща HTTP заявки от клиента към сървъра и след това обработва отговора на сървъра, без да презарежда цялата страница. Така че, когато направите AJAX повикване, вие не сте много сигурни за времето, необходимо на сървъра да ви изпрати отговор.
От гледна точка на тестер, ако проверявате съдържанието или елемента, който ще се показва, трябва да изчакате, докато получите отговора. По време на AJAX повикване данните се съхраняват в XML формат и се извличат от сървъра.
Как да обработваме Ajax повиквания Selenium Уебдрайвер
- най-голямото предизвикателство при обработката на Ajax повикване е да знаете времето за зареждане на уеб страницата. Тъй като зареждането на уеб страницата ще продължи само за части от секунди, за тестера е трудно да тества такова приложение чрез инструмент за автоматизация. за това, Selenium Webdriver трябва да използва метода на изчакване при това повикване на Ajax.
Така че чрез изпълнение на тази команда за изчакване, селенът ще спре изпълнението на текущия Тестов случай и изчакайте очакваната или нова стойност. Когато се появи новата стойност или поле, спрените тестови случаи ще бъдат изпълнени от Selenium Уебдрайвер.
Следват методите за изчакване, които Selenium Webdriver може да използва
Thread.Sleep()
- Thread.Sleep () не е мъдър избор, тъй като спира текущата нишка за определеното време.
- В AJAX никога не можете да сте сигурни за точното време на изчакване. Така че вашият тест ще се провали, ако елементът не се покаже в рамките на времето за изчакване. Освен това, това увеличава режийните разходи, тъй като извикването на Thread.sleep(t) кара текущата нишка да бъде преместена от изпълняващата се опашка в чакащата опашка.
- След достигане на времето 't' текущата нишка ще се премести от опашката за чакане в опашката за готовност и след това отнема известно време, за да бъде избрана от процесора и да бъде изпълнена.
Неявно изчакване ()
- Този метод казва на webdriver да изчака, ако елементът не е достъпен веднага, но това изчакване ще бъде в сила през цялото време, докато браузърът е отворен. Така че всяко търсене на елементите на страницата може да отнеме времето, за което е зададено неявното изчакване.
Изрично изчакване ()
- Изрично изчакване се използва за замразяване на изпълнението на теста до момента, в който определено условие е изпълнено или изтече максималното време.
WebdriverWait
- Може да се използва при всякакви условия. Това може да се постигне с WebDriverWait в комбинация с ExpectedCondition
- Най-добрият начин да изчакате елемент динамично е да проверявате условието всяка секунда и да продължите към следващата команда в скрипта веднага щом условието бъде изпълнено.
Но проблемът с всички тези чакания е, че трябва да споменете единицата за изчакване. Ами ако елементът все още не присъства в рамките на времето? Така че има още едно чакане, наречено Fluent wait.
Свободно изчакайте
- Това е реализация на интерфейса Wait, който има време за изчакване и интервал на запитване. Всеки екземпляр на FluentWait определя максималното време за изчакване на условие, както и честотата, с която да се проверява условието.
Предизвикателства при обработката на Ajax повикване Selenium Уебдрайвер
- Използването на команда „пауза“ за обработка на Ajax повикване не е напълно надеждно. Дългата пауза прави теста неприемливо бавен и увеличава Тестване време. Вместо това „waitforcondition“ ще бъде по-полезно при тестване на Ajax приложения.
- Трудно е да се оцени рискът, свързан с определени приложения на Ajax
- Дадената пълна свобода на разработчиците да променят приложението на Ajax прави процеса на тестване предизвикателен
- Създаването на заявка за автоматизиран тест може да е трудно за инструментите за тестване, тъй като такива AJAX приложения често използват различни техники за кодиране или сериализиране за подаване на POST данни.
Примерен код за използване на Ajax HANDLING 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(); } }
Oбобщение
- AJAX позволява на уеб страницата да извлича малки количества данни от сървъра, без да презарежда цялата страница.
- За да тествате приложението Ajax, трябва да се приложат различни методи за изчакване
- ThreadSleep
- Неявно изчакайте
- Изрично изчакайте
- WebdriverWait
- Свободно изчакайте
- Създаването на заявка за автоматизиран тест може да е трудно за инструментите за тестване, тъй като такива AJAX приложения често използват различни техники за кодиране или сериализиране за подаване на POST данни.