Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Protractor 使用带循环的量角器填充表单从Cucumber.js表获取数据_Protractor_Cucumberjs - Fatal编程技术网

Protractor 使用带循环的量角器填充表单从Cucumber.js表获取数据

Protractor 使用带循环的量角器填充表单从Cucumber.js表获取数据,protractor,cucumberjs,Protractor,Cucumberjs,(我看过,但不确定如何将其应用到我的案例中,因此我提出了一个新问题。希望这不是重复) 我正在用cumber.js测试一个用Angular编写的表单 所以我想做的是告诉量角器去点击一个字段的标题(这是一个链接),然后,当该字段出现时,在其中输入一些文本,然后转到下一个字段的标题,依此类推 以下是我的步骤: When I fill the form with the following data | field | content | | F

(我看过,但不确定如何将其应用到我的案例中,因此我提出了一个新问题。希望这不是重复)

我正在用cumber.js测试一个用Angular编写的表单

所以我想做的是告诉量角器去点击一个字段的标题(这是一个链接),然后,当该字段出现时,在其中输入一些文本,然后转到下一个字段的标题,依此类推

以下是我的步骤:

When I fill the form with the following data
    | field            | content           |
    | First Name       | John              |
    | Last Name        | Doe               |
    | Address          | Some test address |
# and so forth
下面是一个半心半意的步骤定义尝试:

this.When(/^I fill the form with the following data$/, function (table, callback) {
    data = table.hashes();
    # that gives me an array of objects such as this one:
    # [ { field: 'First Name', content: 'John' },...]

    for (var i = 0; i < data.length; i++){
        var el = element(by.cssContainingText('#my-form a', data[i].field));
          el.click().then(function(){
                var fieldEl = el.element(by.xpath("../.."))
                    .element(by.css('textarea'));
                fieldEl.sendKeys(data[i].content);
            });
        }
    };
    callback();
});
this.When(/^I)用以下数据填写表单$/,函数(表,回调){
data=table.hashes();
#这给了我一个对象数组,比如:
#[{字段:“名字”,内容:“约翰”},…]
对于(变量i=0;i
但当然,这是行不通的,因为即使在量角器有时间单击字段名并在字段中输入必要的数据之前,回调函数也会被调用,Cucumber会进入下一步


因此,我的问题是,如何使用cumber.js中的dragrator编写将cumber表中定义的数据插入表单字段的步骤?使用for循环是否可行?

您的循环正在排队,因此循环在任何“单击”或发送键之前完成。在所有承诺都解决后,您需要调用
callback

我认为有两种解决办法。您可以跟踪数组中的承诺,然后使用
量角器.promise.all
(请参阅)等待承诺数组完成。首先将承诺保存在
var promissions=[]
数组中:

var p = el.click().then(function(){ ... });
promises.push(p)
然后在循环之外:

protractor.promise.all(promises).then(callback);
var p = fieldEl.sendKeys(data[i].content);
if (i === data.length - 1) { // beware: you want to check "i" inside the loop and not in a promise created in the loop.
     p.then(callback);
}
或者,您可以依靠ControlFlow在循环中保持承诺的有序性,并在循环的最后一次迭代中调用回调:

protractor.promise.all(promises).then(callback);
var p = fieldEl.sendKeys(data[i].content);
if (i === data.length - 1) { // beware: you want to check "i" inside the loop and not in a promise created in the loop.
     p.then(callback);
}

尽管所有文本都与此相反,但我不能保证这两项工作都会成功。希望他们至少能为您指明正确的方向。

谢谢!我尝试了你建议的第一种方法,它基本上是有效的。我可以在浏览器中看到,量角器打开正确的字段并将正确的数据插入其中,但随后关闭Selenium并使步骤失败,但没有解释原因。我还不知道如何解决这个问题,但这似乎是另一回事。只是想指出,量角器的API被称为
promise
(正如您第一次正确编写的那样),而不是
promises
。如果您尝试调用
grandor.promises.all
,grandor会抱怨它“无法调用undefined的'all'方法”。奇怪的是:grandor/Cucumber首先失败(可以在控制台中看到),然后继续单击链接并填写表单字段。出于好奇,为什么要使用
量角器.promise.all
而不仅仅是
promise.all
量角器版本在混音中添加了什么特别的东西>?这在我的情况下是有效的。在同步函数中使用循环是很棘手的,这一次帮助我完成了我的代码。我尝试了同样的方法,但无法控制台打印“data[I].content”,知道为什么吗?这对你来说行得通吗?