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

时间:2013-03-11 10:59:26

标签: selenium

我们有大型套件的selenium脚本,有些测试是“不稳定的”:在CI版本中,它们会失败,但在开发机器上它们没问题。

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

这让我想到了这个问题:

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

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

是否有诀窍等待足够长

由于我们的套件太大,我不想在每个测试用例中维护/处理它,但通常在测试框架或服务器端。

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

2 个答案:

答案 0 :(得分:0)

这是您可以做的(高级)。

在客户端上,您可以调用您的API。 API完成后(无论成功还是失败),您都可以设置一个全局变量,说明API已完成。

${2}

然后在Java Selenium代码中,您可以通过$.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

然后在测试中可以使用:

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

这应该让您入门。

答案 1 :(得分:-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); 

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