如何处理 AJAX 调用 Selenium 网络驱动程序
什么是阿贾克斯?
AJAX 代表 异步 Java脚本和 XML, 并且它允许网页从服务器检索少量数据,而无需重新加载整个页面。
Ajax 是一种用于创建快速动态网页的技术。该技术是异步的,并使用了 Javascript 和 XML。它将更新网页的某些部分,而无需重新加载整个页面。一些使用 AJAX 技术的著名应用程序包括 Gmail、Google Maps、Facebook、Youtube 等。
Ajax 如何工作?
例如,当您点击提交按钮时, JavaScript 将向服务器发出请求,解释结果并更新当前屏幕,而无需重新加载网页。
- Ajax 调用是由浏览器发起的异步请求,不会直接导致页面转换。这意味着,如果您发起 Ajax 请求,则在请求等待响应时,用户仍可以使用应用程序。
- AJAX 将 HTTP 请求从客户端发送到服务器,然后处理服务器的响应,而无需重新加载整个页面。因此,当您进行 AJAX 调用时,您 不太确定服务器发送响应所需的时间.
从测试人员的角度来看,如果您正在检查内容或要显示的元素,则需要等待直到获得响应。在 AJAX 调用期间,数据以 XML 格式存储并从服务器检索。
如何处理 Ajax 调用 Selenium 网络驱动程序
- 处理 Ajax 调用的最大挑战是了解网页的加载时间。 由于网页的加载时间只有几分之一秒,测试人员很难通过自动化工具测试此类应用程序。为此, Selenium Webdriver 必须在此 Ajax 调用上使用 wait 方法。
因此,通过执行此等待命令,selenium 将暂停当前执行 测试用例 并等待预期或新值。当出现新值或字段时,暂停的测试用例将由 Selenium 网络驱动程序。
以下是等待方法 Selenium Webdriver 可以使用
线程.Sleep()
- Thread.Sleep() 不是一个明智的选择,因为它会将当前线程暂停指定的时间。
- 在 AJAX 中,您永远无法确定确切的等待时间。因此,如果元素在等待时间内未出现,您的测试将失败。此外,它还增加了开销,因为调用 Thread.sleep(t) 会使当前线程从运行队列移至等待队列。
- 当时间 t 到达后,当前线程会从等待队列移到就绪队列,然后需要一段时间才能被 CPU 选中并运行。
隐式等待()
- 如果元素不是立即可用,此方法会告诉 webdriver 等待,但此等待将在浏览器打开的整个时间内进行。因此,对页面上元素的任何搜索都可能需要设置隐式等待的时间。
显式等待()
- 明确等待 用于冻结测试执行,直到满足特定条件或最大时间流逝为止。
Webdriver等待
- 它可以用于任何条件。这可以通过结合使用 WebDriverWait 和 ExpectedCondition 来实现
- 动态等待元素的最佳方式是每秒检查一次条件,并在满足条件后立即继续执行脚本中的下一个命令。
但所有这些等待的问题是,你必须提到超时单位。如果元素在规定的时间内仍未出现怎么办?因此,还有一种等待称为 Fluent 等待。
流利的等待
- 这是 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(); } }
总结
- AJAX 允许网页从服务器检索少量数据,而无需重新加载整个页面。
- 要测试 Ajax 应用程序,应采用不同的等待方法
- 线程休眠
- 隐式等待
- 显式等待
- Webdriver等待
- 流利的等待
- 创建自动化测试请求对于测试工具来说可能很困难,因为 AJAX 应用程序通常使用不同的编码或序列化技术来提交 POST 数据。