如何使用Selenium Java WebDriver测试轮询javascript ajax调用

如何使用Selenium Java WebDriver测试轮询javascript ajax调用,java,selenium,selenium-webdriver,webdriver,Java,Selenium,Selenium Webdriver,Webdriver,我有一个包含JavaScript代码的页面,它每秒轮询一个API,并用响应替换HTML页面中的and元素。我想使用SeleniumWebDriver测试这个页面。我在Junit测试中设置了WebDriver,但我不知道如何处理轮询Java脚本 RemoteWebDriver driver = chrome.getWebDriver(); driver.get("http://localhost:8080"); JavaScript代码配置了一个计时器来调用getMessag

我有一个包含JavaScript代码的页面,它每秒轮询一个API,并用响应替换HTML页面中的and元素。我想使用SeleniumWebDriver测试这个页面。我在Junit测试中设置了WebDriver,但我不知道如何处理轮询Java脚本

RemoteWebDriver driver = chrome.getWebDriver();
driver.get("http://localhost:8080");
JavaScript代码配置了一个计时器来调用
getMessage()
的设置如下

 <body>
    <h1 id="message"> Loading ... </h1>
</body>
<script>
    function getMessage()
    {
        $.ajax({
            url : '/message',
            type: 'GET',
            success: function(data){
                $('#message').text(data.message);
            },
            error: function (data) {
                $('#message').text("Error Response");
            }
        });
    }

    $(document).ready(function() {
        window.setInterval(getMessage, 1000);
    });
</script>

加载。。。
函数getMessage()
{
$.ajax({
url:“/message”,
键入:“GET”,
成功:功能(数据){
$('#message').text(data.message);
},
错误:函数(数据){
$(“#消息”).text(“错误响应”);
}
});
}
$(文档).ready(函数(){
设置间隔(getMessage,1000);
});

我想测试H1消息值在30秒内每隔一秒左右更改一次,所以我希望在30秒的测试运行中看到25次更改。如何使用Selenium WebDriver实现这一点?

下面是每两秒钟打印一次消息的一种常见方法

我们可以编写自己的函数并将该函数传递给FluentWait方法。它将每隔2秒调用此方法&超时设置为30秒。当计数大于10时,我们使用计数器。它应该会从我这里出来。可能需要根据您的需要进行一些重构

Function<WebDriver, Boolean> function = new Function<WebDriver, Boolean>()
 {
    int count = 1;
    public Boolean apply(WebDriver arg0) {
    count++;
    WebElement element = arg0.findElement(By.id("message"));
    String text= element.getText(); 
    System.out.println("Message " + text); // your logic
    if(count > 10))
    {
       return true;
    }
    return false;
    }
 }
Function=new Function()
{
整数计数=1;
公共布尔应用(WebDriver arg0){
计数++;
WebElement=arg0.findElement(By.id(“message”);
String text=element.getText();
System.out.println(“Message”+text);//您的逻辑
如果(计数>10))
{
返回true;
}
返回false;
}
}
举例说明。假设驾驶员路径等设置正确

public static void main(String[] args) throws InterruptedException {
 
 WebDriver driver = new FirefoxDriver();
 driver.get("http://localhost:8080");
 
 FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver);
 wait.pollingEvery(Duration.ofSeconds(2));
 wait.withTimeout(Duration.ofSeconds(30));
 wait.ignoring(NoSuchElementException.class);
 
 Function<WebDriver, Boolean> function = new Function<WebDriver, Boolean>()
 {
   int count = 1;
   public Boolean apply(WebDriver arg0) {
   count++;
   WebElement element = arg0.findElement(By.id("message"));
   String text= element.getText(); 
   System.out.println("Message " + text); // your logic
   if(count > 10))
   {
      System.out.println(count + "++++++++++++++++++");
      return true;
   }
   return false;
  }
  };
 
 wait.until(function);// You can handle timeout exception using try-catch as per your 
 //use case
}
publicstaticvoidmain(String[]args)抛出InterruptedException{
WebDriver=newfirefoxdriver();
驱动程序。获取(“http://localhost:8080");
FluentWait=新FluentWait(驱动程序);
wait.pollingEvery(持续时间秒(2));
wait.withTimeout(持续时间秒(30));
忽略(NoSuchElementException.class);
函数=新函数()
{
整数计数=1;
公共布尔应用(WebDriver arg0){
计数++;
WebElement=arg0.findElement(By.id(“message”);
String text=element.getText();
System.out.println(“Message”+text);//您的逻辑
如果(计数>10))
{
System.out.println(计数+“+”+“+”);
返回true;
}
返回false;
}
};
wait.until(函数);//您可以根据自己的
//用例
}

以下是另一种方法:

private boolean testElementFor1SecChange(SearchContext SearchContext,按定位器,持续时间testDuration){
String baseElementText=searchContext.findElement(locator.getText();
for(int i=0;i
因此,测试将如下所示:

@测试
公共void testChanges(){
驱动程序。获取(“http://localhost:8080");
Assert.assertTrue(
testElementFor1SecChange(驱动程序,按.id(“消息”),持续时间为秒(30))
);
}

您到底需要测试什么?要测试页面上的值是否每30秒更改一次?或者测试间隔是否为30秒?或者测试值是否更改为响应中接收到的内容?我想测试值是否每秒更改一次,持续30秒左右。