我们有大型套件的selenium脚本,有些测试是“不稳定的”:在CI版本中,它们会失败,但在开发机器上它们没问题。
我们假设原因在于性能:CI构建比开发机器慢,我们的应用程序在执行操作后直接阻止与Web应用程序的任何交互,直到服务器响应返回。
这让我想到了这个问题:
客户如何知道服务器可能需要多长时间?
我们可以在每次点击后等待很长时间 - >但这会严重降低测试套件的速度。
是否有诀窍等待足够长?
由于我们的套件太大,我不想在每个测试用例中维护/处理它,但通常在测试框架或服务器端。
我对硒没有太多技术经验,但这听起来更像是一个概念问题。
答案 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);
在第一次测试(或左右)之后,超时将越来越接近服务器实际响应的平均时间。