如何在Selenium WebDriver中处理Ajax调用
什么是Ajax?
Ajax代表异步JavaScript&XML,它允许Web页面从服务器检索少量数据,而无需重新加载整个页面。
AJAX是一种用于创建快速动态网页的技术。该技术是异步的,并结合使用Javascript和XML。
它将更新网页的一部分,而无需重新加载整个页面。
使用AJAX技术的一些著名应用程序有Gmail、Google Maps、Facebook、YouTube等。
在本教程中,将了解-
- 什么是Ajax?
- AJAX是如何工作的?
- 如何使用Selenium Webdriver处理Ajax调用
- 在Selenium WebDriver中处理Ajax调用的挑战
AJAX是如何工作的?
例如,当单击提交按钮时,JavaScript将向服务器发出求,解释结果并更新当前屏幕,而无需重新加载网页。
- Ajax调用是由浏览器发起的异步求,它不会直接导致页面转换。这意味着,如果发出Ajax求,用户仍然可以在求等待响应的同时处理应用程序。
- Ajax将HTTP求从客户端发送到服务器,然后处理服务器的响应,而无需重新加载整个页面。因此,当进行Ajax调用时,不太确定服务器向发送响应所花费的时间。
从测试人员的角度来看,如果正在检查要显示的内容或元素,则需要等待,直到得到响应。在Ajax调用期间,数据以XML格式存储,并从服务器检索。
如何使用Selenium Webdriver处理Ajax调用
处理Ajax调用的最大挑战是了解网页的加载时间。由于Web页面的加载将只持续一小部分时间,因此Selenium Webdriver必须在此Ajax调用上使用等待方法。
因此,通过执行此等待命令,Selenium将暂停当前测试用例的执行,并等待期望值或新值。当出现新的值或字段时,挂起的测试用例将由Selenium Webdriver执行。
下面是Selenium Webdriver可以使用的等待方法
- Thread.Sleep()
- Thread.Sept()不是一个明智的选择,因为它会将当前线程挂起指定的时间量。
- 在Ajax中,永远无法确定确切的等待时间。所以,测试将此外,由于调用 Thread.sleep(t) 会使当前线程从运行队列移到等待队列,因此增加了开销。
- 在到达时间‘t’之后,当前线程将从等待队列移动到就绪队列,然后需要一些时间才能被CPU挑选并运行。
- 隐式 Wait()
- 此方法告诉Webdriver,如果元素不能立即可用,则等待,但此等待将在浏览器打开的整个时间内一直存在。因此,对页面上的元素进行任何搜索都可能需要设置隐式等待的时间。
- 显式 Wait()
- 显式等待用于冻结测试执行,直到满足特定条件或经过最大时间。
- Web驱动程序等待
- 它可以在任何条件下使用。这可以通过将WebDriverWait与ExspectedCondition结合使用来实现
- 动态等待元素的最佳方式是每秒检查一次条件,并在满足条件后立即继续执行脚本中的下一个命令。
但所有这些等待的问题是,必须提到超时单元。如果元素在时间内仍然不存在怎么办?所以还有一种等待叫做流畅等待。
- 流畅的等待
- 这是具有超时和轮询间隔的等待接口的实现。每个FluentWait实例确定等待条件的最长时间,以及检查条件的频率。
在Selenium WebDriver中处理Ajax调用的挑战
- 使用“暂停”命令处理AJAX调用并不完全可靠。过长的暂停时间会使测试变得不可接受地缓慢,并增加测试时间。相反,“waitfordition”在测试Ajax应用程序时会更有帮助。
- 很难评估与特定Ajax应用程序相关的风险
- 给予开发人员修改Ajax应用程序的完全自由使得测试过程具有挑战性
- 创建自动测试求对于测试工具来说可能很困难,因为这样的Ajax应用程序通常使用不同的编码或序列化技术来提交POST数据。
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 = "http://www.itxiaonv.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允许Web页面从服务器检索少量数据,而无需重新加载整个页面。
-
要测试Ajax应用程序,应该应用不同的等待方法
- 线程睡眠
- 隐式等待
- 显式等待
- Web驱动程序等待
- 流畅的等待
- 创建自动测试求对于测试工具来说可能很困难,因为这样的Ajax应用程序通常使用不同的编码或序列化技术来提交POST数据。