3

我们有大量的 selenium 脚本,其中一些测试是“不稳定的”:在 CI 构建上它们失败了,但在开发机器上它们没问题。

我们假设原因在于性能:CI 构建比开发机器慢,并且我们的应用程序在操作后直接阻止与 Web 应用程序的任何交互,直到服务器响应返回。

这让我想到了一个问题:

客户端如何知道服务器可能需要多长时间?

我们可以在每次点击后等待很长时间 -> 但这会大大降低测试套件的速度。

等待足够长的时间有什么诀窍吗?

由于我们的套件如此之大,我不想在每个测试用例中都维护/处理它,而是通常在测试框架或服务器端进行维护/处理。

我对硒没有太多的技术经验,但这听起来更像是一个概念问题。

4

2 回答 2

0

这就是你可以做的(在高层次上)。

在客户端上,您可以调用您的 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++;
});

JavascriptExecutor然后在 Java Selenium 代码中,您可以通过驱动程序访问这些变量。

private static Map<String, Object> getState(WebDriver driver)
{
    Map<String, Object> map = (Map<String,Object>)((JavascriptExecutor)driver).executeScript("return window.testVars");
    return map;
}

然后在您的测试中,您可以使用:

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);

这应该让你开始。

于 2019-07-16T18:17:01.123 回答
-1

在课堂上,你可以有字段

public int startTime;
public int stopTime;
public int averageResponseTime = 2000; 

在这里,设置averageResponseTime为您愿意等待响应的最长时间(在本例中为 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;

在您的测试中,实例化一个新的等待,averageResponseTime 作为 waitTimeout传入

WebDriverWait wait = new WebDriverWait(driver, averageResponseTime); wait.until(expectedCondition); 

在第一次测试(左右)之后,超时将越来越接近服务器实际响应所需的平均时间。

于 2013-05-21T18:30:11.780 回答