我正在使用量角器为角应用设置一套e2e测试。我正在遵循此article中详述的页面对象模型模式。我在使用特定测试时遇到问题,该测试涉及创建用户并验证数据是否已正确处理/保留。该测试的步骤如下:
1。)通过让protactor从User对象向表单发送数据并提交它来创建用户:
//models.js
TestUser = {
Title: 'Big Boss Man',
Email: 'theboss@gmail.com',
}
2。)通过检查新创建的用户"帐户详细信息"中的数据,验证数据是否已正确处理/保留。视图。此数据显示在如下表格中:
// accountdetails.html
<table class="account-details" summary="Account details">
<tbody>
<tr>
<th>Title:</th>
<td class="ng-binding">Big Boss Man</td>
</tr>
<tr>
<th>Email:</th>
<td class="ng-binding">theboss@gmail.com</td>
</tr>
</tbody>
</table>
3。)使用一个简单的辅助方法,使用jasmine的toEqual()方法比较两个传入对象的匹配键/值对:
compareTwoObjects: function(object1, object2) {
Object.keys(object1).forEach(function(key) {
expect(object2[key].getAttribute('value')).toEqual(object1[key]);
});
问题:如何编写一个使用元素选择器查找表的方法,深入查看<th>
和<td>
元素,获取文本值,并构建密钥对象/ value对,我可以与原始TestUser
对象进行比较?因为我显然不太了解承诺,所以我想出了以下内容:
getUserData: {
get: function() {
var userData = {};
$$('table[summary="Account details"] tbody tr')
.then(function(rowElements) {
rowElements.forEach(function(rowElement) {
rowElement.$('th').getText().then(function(label) {
rowElement.$('td').getText().then(function(text) {
userData[label.slice(0,-1)] = text;
// success! logs {Title: 'Big Boss Man', Email: 'theboss@gmail.com'}
// on completion of loop
console.log(userData);
});
});
});
});
// failure, logs an empty object
console.log(userData);
return userData;
}
}
我理解它无法正常工作,因为在解决上述承诺之前会返回userData。我怎样才能绕过这个或者我需要以不同的方式思考什么呢?
答案 0 :(得分:0)
按文字获取th
元素,使用following-sibling
找到用户字段值并构建user
对象:
var user = {
Title: row.element("//th[. = 'Title:']/following-sibling::td").getText(),
Email: row.element("//th[. = 'Email:']/following-sibling::td").getText()
};
使用示例:
expect(user).toEqual(TestUser);
请注意user
是一个对象,其中字段值是promises,但是,从expect()
is patched to resolve promises implicitly开始,我们很高兴 - 它应该在所有promise都被解析后进行断言。
如果您想抽象出字段名称并使其可重复使用,请使用map()
:
var table = $("table.account-details");
var user = {};
table.all(".//th").map(function (elm) {
var key = elm.getText(),
value = elm.element(by.xpath("following-sibling::td")).getText();
user[key] = value;
});
expect(user).toEqual(TestUser);