使用protractor-cucumber-framework
,我试图在一个步骤中单击按钮一百次。但是,执行此操作将导致超时,默认值为5000ms超时值。我不想使用以下方式更改此默认值:
var config = function() {
this.setDefaultTimeout(60*1000);
};
module.exports = config;
这样可行,但我宁愿为这一步设置超时:
this.When(/^I click on the "([^"]*)" button$/, {timeout: 60*1000}, function(text, callback)
{
// Click the button 100 times
var button = element(by.partialButtonText('Widget'));
for(j = 0; j < i; j++) {
button.click();
}
callback();
});
根据cucumber-js readme此应的工作原理,但仍会导致:
Error: Step timed out after 5000 milliseconds
at Timer.listOnTimeout (timer.js:92:15)
关于为什么这不起作用的任何想法?
编辑: 工作。但是,我在错误的步骤中使用它。拨打click()
一百次并不需要这么长时间。它在它之后的步骤超时:
this.Then(/^a new widget is created$/, {timeout: 60 * 1000}, function(callback) {
// Check if 100 widgets are created
});
现在有人可以解释为什么在对click
的所有调用之后步骤中需要长时间超时?是否有更优雅的方式让黄瓜等待按钮完成?
答案 0 :(得分:3)
超时对您没有预期效果的原因是您的callback()
提前解雇,即使在第一个click()
完成之前也是如此。这是因为click()
是异步的并且被添加到量角器controlFlow
(它们排队等待一个接一个地被触发),但callback()
不是。有几种方法可以避免这种情况。
一旦callback()
返回的所有承诺都得到满足,您应确保click()
仅被解雇。
您可以收集所有已退回的承诺,并在解决所有承诺后致电callback()
。如果您不知道controlFlow
:
this.When(/^I click on the "([^"]*)" button$/, {timeout: 60*1000}, function(text, callback)
{
// Click the button 100 times
var button = element(by.partialButtonText('Widget'));
var promises = [];
for (var i = 0; i < 101; i++) {
promises.push(button.click());
}
protractor.promise.all(promises).then(callback);
});
但是,如果您将callback()
隐藏在controlFlow
队列中,事情就会变得容易得多:
this.When(/^I click on the "([^"]*)" button$/, {timeout: 60*1000}, function(text, callback)
{
// Click the button 100 times
var button = element(by.partialButtonText('Widget'));
for(var i = 0; i < 101; i++) {
button.click();
}
browser.controlFlow().execute(callback);
});
正如您所看到的,在使用Protractor时,您应该使用其controlFlow
来避免编写异步(查找)代码。