黄瓜JS超时不起作用

Jus*_*ser 6 javascript protractor cucumberjs

使用protractor-cucumber-framework,我试图在一个步骤中单击一百次按钮.但是,执行此操作将导致超时,默认值为5000ms超时值.我宁愿不使用以下方法更改此默认值:

var config = function() {
    this.setDefaultTimeout(60*1000);
};

module.exports = config;
Run Code Online (Sandbox Code Playgroud)

这有效,但我宁愿为这一步设置超时,如下所示:

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();
});
Run Code Online (Sandbox Code Playgroud)

根据cucumber-js自述文件,应该可行,但仍然会导致:

Error: Step timed out after 5000 milliseconds
    at Timer.listOnTimeout (timer.js:92:15)
Run Code Online (Sandbox Code Playgroud)

关于为什么这不起作用的任何想法?

编辑:它确实有效.但是,我在错误的步骤中使用它.召唤click()一百次并不需要这么长时间.它在它之后的步骤超时:

this.Then(/^a new widget is created$/, {timeout: 60 * 1000}, function(callback) {
    // Check if 100 widgets are created
});
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么所有调用之后的步骤中需要长超时click?是否有更优雅的方式让黄瓜等待按钮完成?

The*_*tor 3

超时没有按预期对您起作用的原因是您的callback()提前被解雇,甚至在第一个click(). 这是因为click()s 是异步的并且被添加到量角器中controlFlow(它们排队等待一个接一个地被触发),但 scallback()不是。有几个选项可以避免这种情况。

选项1

您应该确保callback()仅在 s 返回的所有承诺都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);
});
Run Code Online (Sandbox Code Playgroud)

选项#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);
});
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在使用 Protractor 时,您应该利用它controlFlow来避免编写异步(看起来)代码。