使用带循环的量角器填写表格,从 Cucumber.js table 获取数据
Using Protractor with loops to fill in a form getting data from a Cucumber.js table
(我看过 但不确定如何将它应用到我的案例中,所以我问了一个新问题。希望它不是重复的)
我正在使用带有 Cucumber.js 的量角器测试用 Angular 编写的表格。
所以我想做的是告诉量角器去点击一个字段的标题(这是一个 link)然后,当那个字段出现时,在里面输入一些文本,然后移动到下一个字段的标题,依此类推。
这是我在 Cucumber 中的步骤:
When I fill the form with the following data
| field | content |
| First Name | John |
| Last Name | Doe |
| Address | Some test address |
# and so forth
这是 half-hearted 定义步骤的尝试:
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();
});
当然,这不起作用,因为甚至在 Protractor 有时间单击字段名称并在字段中输入必要的数据之前,回调函数就会被调用,Cucumber 会进入下一步。
所以我的问题是,如何将 Protractor 与 Cucumber.js 结合使用,编写将 Cucumber table 中定义的数据插入表单字段的步骤?使用 for 循环是否可行?
您的循环正在排队承诺,因此循环在任何 "clicking" 或发送密钥发生之前完成。您需要在所有承诺都已解决后调用 callback
。
我看到了两个解决方案(我认为)。您可以跟踪数组中的承诺,然后使用 protractor.promise.all
(参见 http://spin.atomicobject.com/2014/12/17/asynchronous-testing-protractor-angular/)等待承诺数组完成。首先将承诺保存在 var promises = []
数组中:
var p = el.click().then(function(){ ... });
promises.push(p)
然后在循环外:
protractor.promise.all(promises).then(callback);
或者,您可以依靠 ControlFlow 在循环中保持您的承诺有序,并在循环的最后一次迭代中调用回调:
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);
}
尽管所有的文字都是相反的,但我不能保证这些都有效。希望他们至少能为您指明正确的方向。
(我看过
我正在使用带有 Cucumber.js 的量角器测试用 Angular 编写的表格。
所以我想做的是告诉量角器去点击一个字段的标题(这是一个 link)然后,当那个字段出现时,在里面输入一些文本,然后移动到下一个字段的标题,依此类推。
这是我在 Cucumber 中的步骤:
When I fill the form with the following data
| field | content |
| First Name | John |
| Last Name | Doe |
| Address | Some test address |
# and so forth
这是 half-hearted 定义步骤的尝试:
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();
});
当然,这不起作用,因为甚至在 Protractor 有时间单击字段名称并在字段中输入必要的数据之前,回调函数就会被调用,Cucumber 会进入下一步。
所以我的问题是,如何将 Protractor 与 Cucumber.js 结合使用,编写将 Cucumber table 中定义的数据插入表单字段的步骤?使用 for 循环是否可行?
您的循环正在排队承诺,因此循环在任何 "clicking" 或发送密钥发生之前完成。您需要在所有承诺都已解决后调用 callback
。
我看到了两个解决方案(我认为)。您可以跟踪数组中的承诺,然后使用 protractor.promise.all
(参见 http://spin.atomicobject.com/2014/12/17/asynchronous-testing-protractor-angular/)等待承诺数组完成。首先将承诺保存在 var promises = []
数组中:
var p = el.click().then(function(){ ... });
promises.push(p)
然后在循环外:
protractor.promise.all(promises).then(callback);
或者,您可以依靠 ControlFlow 在循环中保持您的承诺有序,并在循环的最后一次迭代中调用回调:
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);
}
尽管所有的文字都是相反的,但我不能保证这些都有效。希望他们至少能为您指明正确的方向。