3.3 如何在Selenium WebDriver中处理Ajax调用

如何在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将向服务器发出求,解释结果并更新当前屏幕,而无需重新加载网页。

Handling AJAX Call in Selenium Webdriver
Handling AJAX Call in Selenium Webdriver
  • Ajax调用是由浏览器发起的异步求,它不会直接导致页面转换。这意味着,如果发出Ajax求,用户仍然可以在求等待响应的同时处理应用程序。
  • Ajax将HTTP求从客户端发送到服务器,然后处理服务器的响应,而无需重新加载整个页面。因此,当进行Ajax调用时,不太确定服务器向发送响应所花费的时间。

从测试人员的角度来看,如果正在检查要显示的内容或元素,则需要等待,直到得到响应。在Ajax调用期间,数据以XML格式存储,并从服务器检索。

如何使用Selenium Webdriver处理Ajax调用

处理Ajax调用的最大挑战是了解网页的加载时间。由于Web页面的加载将只持续一小部分时间,因此Selenium Webdriver必须在此Ajax调用上使用等待方法。

因此,通过执行此等待命令,Selenium将暂停当前测试用例的执行,并等待期望值或新值。当出现新的值或字段时,挂起的测试用例将由Selenium Webdriver执行。

下面是Selenium Webdriver可以使用的等待方法

  1. Thread.Sleep()
  • Thread.Sept()不是一个明智的选择,因为它会将当前线程挂起指定的时间量。
  • 在Ajax中,永远无法确定确切的等待时间。所以,测试将此外,由于调用 Thread.sleep(t) 会使当前线程从运行队列移到等待队列,因此增加了开销。
  • 在到达时间‘t’之后,当前线程将从等待队列移动到就绪队列,然后需要一些时间才能被CPU挑选并运行。
  1. 隐式 Wait()
  • 此方法告诉Webdriver,如果元素不能立即可用,则等待,但此等待将在浏览器打开的整个时间内一直存在。因此,对页面上的元素进行任何搜索都可能需要设置隐式等待的时间。
  1. 显式 Wait()
  • 显式等待用于冻结测试执行,直到满足特定条件或经过最大时间。
  1. Web驱动程序等待
  • 它可以在任何条件下使用。这可以通过将WebDriverWait与ExspectedCondition结合使用来实现
  • 动态等待元素的最佳方式是每秒检查一次条件,并在满足条件后立即继续执行脚本中的下一个命令。

但所有这些等待的问题是,必须提到超时单元。如果元素在时间内仍然不存在怎么办?所以还有一种等待叫做流畅等待。

  1. 流畅的等待
  • 这是具有超时和轮询间隔的等待接口的实现。每个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数据。

IT赶路人

专注IT知识分享