使用量角器从promises获取数据

时间:2015-04-08 21:52:19

标签: javascript angularjs protractor

我正在使用量角器为角应用设置一套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。我怎样才能绕过这个或者我需要以不同的方式思考什么呢?

1 个答案:

答案 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);