如何处理 AJAX 调用 Selenium 网络驱动程序

什么是阿贾克斯?

AJAX 代表 异步 Java脚本和 XML, 并且它允许网页从服务器检索少量数据,而无需重新加载整个页面。

Ajax 是一种用于创建快速动态网页的技术。该技术是异步的,并使用了 Javascript 和 XML。它将更新网页的某些部分,而无需重新加载整个页面。一些使用 AJAX 技术的著名应用程序包括 Gmail、Google Maps、Facebook、Youtube 等。

Ajax 如何工作?

例如,当您点击提交按钮时, JavaScript 将向服务器发出请求,解释结果并更新当前屏幕,而无需重新加载网页。

Ajax 的工作原理

  • 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 数据。