如何使用Selenium Java WebDriver测试轮询javascript ajax调用
我有一个包含JavaScript代码的页面,它每秒轮询一个API,并用响应替换HTML页面中的and元素。我想使用SeleniumWebDriver测试这个页面。我在Junit测试中设置了WebDriver,但我不知道如何处理轮询Java脚本如何使用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
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秒左右。