黄瓜 JS 超时将不起作用
Cucumber JS timeout won't work
使用 protractor-cucumber-framework
,我试图在一个 When-step 中点击一个按钮一百次。但是,这样做会导致超时,默认超时值为 5000 毫秒。我不想使用以下方式更改此默认设置:
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
的所有调用之后的步骤 中需要长时间超时?有没有更优雅的方法让黄瓜等待按钮点击完成?
超时对您不起作用的原因是您的 callback()
提前触发,甚至在第一个 click()
完成之前。这是因为 click()
是异步的并且被添加到量角器的 controlFlow
(它们排队等候一个接一个被触发),但 callback()
不是。有几个选项可以避免这种情况。
选项#1
您应该确保 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);
});
选项#2
但是如果您像这样将 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
以避免编写异步(查找)代码。
使用 protractor-cucumber-framework
,我试图在一个 When-step 中点击一个按钮一百次。但是,这样做会导致超时,默认超时值为 5000 毫秒。我不想使用以下方式更改此默认设置:
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
的所有调用之后的步骤 中需要长时间超时?有没有更优雅的方法让黄瓜等待按钮点击完成?
超时对您不起作用的原因是您的 callback()
提前触发,甚至在第一个 click()
完成之前。这是因为 click()
是异步的并且被添加到量角器的 controlFlow
(它们排队等候一个接一个被触发),但 callback()
不是。有几个选项可以避免这种情况。
选项#1
您应该确保 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);
});
选项#2
但是如果您像这样将 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
以避免编写异步(查找)代码。