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);
});