如何处理 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 数据。