【问题标题】:Get data from promises with protractor使用量角器从 Promise 中获取数据
【发布时间】:2015-06-14 01:59:21
【问题描述】:

我正在使用量角器为 Angular 应用程序设置一套 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]);
});

问题:我如何编写一个使用元素选择器查找表的方法,深入了解&lt;th&gt;&lt;td&gt; 元素,获取它们的文本值,并构建一个键/值对对象我可以与原始的TestUser 对象进行比较吗?因为我显然对promise不是很了解,所以我想出了以下内容:

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。我该如何解决这个问题,或者我需要有什么不同的想法?

【问题讨论】:

    标签: javascript angularjs protractor


    【解决方案1】:

    通过文本获取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 是一个字段值是承诺的对象,但是,由于 expect() is patched to resolve promises implicitly,我们很高兴 - 一旦所有承诺都得到解决,它应该做出断言。


    如果您想抽象出字段名称并使其可重用,请使用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); 
    

    【讨论】:

    • 感谢您的快速响应!我喜欢用将由expect() 解决的promise 填充返回的对象。但是,我希望从整个站点的不同表中获取数据,因此我想对其进行抽象,以便它根据在特定表的“”值中找到的内容动态填充新对象的键,而不是硬编码它...
    • @christian.d 你能检查一下更新吗? (未经测试,但希望它对你有用)。谢谢。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签