Selenium:等待服务器响应的时间是否足够长?

Selenium:等待服务器响应的时间是否足够长?,selenium,Selenium,我们有大量的selenium脚本套件,其中一些测试是“不稳定的”:在CI构建上,它们失败了,但在开发机器上,它们是正常的 我们假设原因在于性能:CI构建比开发人员的机器慢,并且我们的应用程序会在一个操作之后直接阻止与web应用程序的任何交互,直到服务器响应返回 这就引出了一个问题: 客户端如何知道服务器可能需要多长时间? 我们可以在每次单击后等待很长时间->但这将大大降低测试套件的速度 等待的时间是否足够长 由于我们的套件非常大,我不想在每个测试用例中都维护/处理它,而是在测试框架或服务器端进行

我们有大量的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的否决投票指南:谢谢。