Cucumber JS超时获胜'不起作用

Cucumber JS timeout won't work

本文关键字:不起作用 获胜 JS 超时 Cucumber      更新时间:2023-09-26

使用protractor-cucumber-framework,我试图在一个When步骤中单击一个按钮一百次。但是,这样做会导致超时,默认超时值为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自述文件,这应该工作,但仍然会导致:

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来避免编写异步(外观)代码。