Javascript 黄瓜JS元';行不通
使用Javascript 黄瓜JS元';行不通,javascript,protractor,cucumberjs,Javascript,Protractor,Cucumberjs,使用量角器cumber framework,我试图在一个步骤中点击一个按钮一百次。但是,这样做将导致默认5000ms超时值的超时。我不希望使用以下方法更改此默认值: var config = function() { this.setDefaultTimeout(60*1000); }; module.exports = config; 这是可行的,但我宁愿这样设置单个步骤的超时: this.When(/^I click on the "([^"]*)" button$/, {tim
量角器cumber 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();
});
你知道为什么这样不行吗
编辑:它确实有效。然而,我用错了步骤。调用click()。它在之后的步骤上超时:
this.Then(/^a new widget is created$/, {timeout: 60 * 1000}, function(callback) {
// Check if 100 widgets are created
});
现在有人能解释一下为什么在所有对单击的调用之后,在步骤中需要长时间超时吗?有没有更优雅的方法让cucumber等待按钮点击完成?超时没有按预期对您起作用的原因是您的回调()
会提前触发,甚至在第一次单击()完成之前。这是因为click()
s是异步的,并且被添加到量角器的controlFlow
(它们被排队依次触发),但是callback()
不是。有几个选项可以避免这种情况
选项1
您应该确保只有在click()
s返回的所有承诺兑现后才会触发callback()
您可以收集返回的所有承诺,并在所有承诺都得到解决后调用您的callback()
。如果您不知道控制流
,您会希望这样做:
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);
});
如您所见,使用量角器时,应使用其控制流
,以避免编写异步(外观)代码。您链接到的文档显示了给定的
功能,而不是时的
。我不是黄瓜专家,但在我所做的一点点挖掘中,我没有找到任何迹象表明,何时
将以您尝试使用的方式接受超时。我编辑了我的问题。它确实起作用,但不是我想象的那样。我认为需要一个更专业的人来回答我的问题,因为我仍然不明白为什么它会这样工作。
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);
});
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);
});