Selenium:等待服务器响应的时间是否足够长?
我们有大量的selenium脚本套件,其中一些测试是“不稳定的”:在CI构建上,它们失败了,但在开发机器上,它们是正常的 我们假设原因在于性能:CI构建比开发人员的机器慢,并且我们的应用程序会在一个操作之后直接阻止与web应用程序的任何交互,直到服务器响应返回 这就引出了一个问题: 客户端如何知道服务器可能需要多长时间? 我们可以在每次单击后等待很长时间->但这将大大降低测试套件的速度 等待的时间是否足够长 由于我们的套件非常大,我不想在每个测试用例中都维护/处理它,而是在测试框架或服务器端进行维护/处理Selenium:等待服务器响应的时间是否足够长?,selenium,Selenium,我们有大量的selenium脚本套件,其中一些测试是“不稳定的”:在CI构建上,它们失败了,但在开发机器上,它们是正常的 我们假设原因在于性能:CI构建比开发人员的机器慢,并且我们的应用程序会在一个操作之后直接阻止与web应用程序的任何交互,直到服务器响应返回 这就引出了一个问题: 客户端如何知道服务器可能需要多长时间? 我们可以在每次单击后等待很长时间->但这将大大降低测试套件的速度 等待的时间是否足够长 由于我们的套件非常大,我不想在每个测试用例中都维护/处理它,而是在测试框架或服务器端进行
我对selenium没有太多的技术经验,但这听起来更像是一个概念问题。在课堂上,你可以有字段
public int startTime;
public int stopTime;
public int averageResponseTime = 2000;
这里,将averagerResponseTime
设置为您愿意等待响应的最长时间(在本例中为2000毫秒)
在@Before/testSetup方法中:
// set the startime for the test
startTime = new Date();
在@After/tearDown方法中:
// set the stopTime
stopTime = new Date();
// calculate how long it took
int duration = stopTime - startTime;
// average out the response time
averageResponseTime = (averageResponseTime + duration)/2;
在测试中,实例化一个新的wait,将averageResponseTime
作为waitTimeout传入
WebDriverWait wait = new WebDriverWait(driver, averageResponseTime); wait.until(expectedCondition);
在第一次测试(大约)之后,超时时间将越来越接近服务器实际响应所需的平均时间。这是您可以做的(在较高级别上)
在客户机上,您可以调用API。当API完成时(无论成功还是失败),您可以设置一个全局变量来声明API已完成
$.getJSON('/some/endpoint.xhtml', {
someParam: someVar
})
.done(function (data) {
// do work
})
.fail(function (data) {
// do error handling
})
.always(function(data) {
// window.testVars will need to be initialized earlier
// like so : window.testVars = { completedEndoint = 0 };
window.testVars.completedEndpoint++;
});
然后在Java Selenium代码中,您可以通过JavascriptExecutor
驱动程序访问这些变量
private static Map<String, Object> getState(WebDriver driver)
{
Map<String, Object> map = (Map<String,Object>)((JavascriptExecutor)driver).executeScript("return window.testVars");
return map;
}
私有静态映射getState(WebDriver驱动程序)
{
Map Map=(Map)((JavascriptExecutor)driver.executeScript(“return window.testVars”);
返回图;
}
然后在测试中,您可以使用:
Map<String,Object> defState = initializeState(driver);
performUseCaseToCallTheEndpoint();
ExpectedCondition<Boolean> condition = new ExpectedCondition<Boolean>()
{
@Override
public Boolean apply(WebDriver driver)
{
Map<String,Object> curState = getState(driver);
if(curState.get("completedEndpoint") > defState get("completedEndpoint"))
{
return true;
}
else
{
return false;
}
}
};
WebDriverWait wait = new WebDriverWait(driver, 60);
wait.until(condition);
Map defState=initializeState(驱动程序);
执行案例调用端点();
ExpectedCondition=新的ExpectedCondition()
{
@凌驾
公共布尔应用(WebDriver驱动程序)
{
Map curState=getState(驱动程序);
if(curState.get(“completedEndpoint”)>defState get(“completedEndpoint”))
{
返回true;
}
其他的
{
返回false;
}
}
};
WebDriverWait wait=新的WebDriverWait(驱动程序,60);
等到(条件);
这应该让您开始。您是如何实现等待语句的?WebDriverWait wait=new WebDriverWait(driver,waitTimeout);等待。直到(预期条件);这没什么问题,我建议您最好的选择是长时间超时,以允许服务器花很长时间进行响应。我发布了一个解决方案,请在@BastlNice有用的情况下upvote/accept,但我们需要在不同的版本上保持平均时间。您是否要求不存储任何持久数据?事实上,在每次构建中开始一个新的平均值可能是有意义的。如果您的服务器的响应时间可能如您所说的那样不同,则以前版本的平均响应时间可能与将来的版本无关。Down-voter,请在Down-voter之前发表评论,解释如何改进我的答案。还可能想回顾一下SO的否决投票指南:谢谢。