从Protractor页面对象返回一个对象

时间:2015-10-30 07:54:20

标签: javascript angularjs selenium jasmine protractor

我有一个像这样的HTML表

<table>
  <tr ng-repeat='row in Entity'>
    <td>row.Name</td>
    <td>row.Surname</td>
    <td>row.Address</td>
  </tr>
</table>

我想创建一个函数,该函数返回一个对象,其中包含我作为参数传递的行号的值,如:

{
  name: 'name',
  surname: 'surname',
  address: 'address'
}

我可以使用map()执行此操作,但是传递所有tr将返回表中的所有对象(是一个非常长的表,它会加载{{1}中的所有项目大约10秒)并传递确切的map将为每个tr返回三个值。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点。您可以使用map()功能获取所需的数据,具体如何 -

function returnObject(eleIndex){
  return element.all(by.repeater('row in Entity')).map(function(elem, index){
        return {
            name: elem.$$('td').get(0).getText(),
            sur: elem.$$('td').get(1).getText(),
            addr: elem.$$('td').get(2).getText()
        }
    }).then(function(obj){
        return obj[eleIndex];
    });
};

另一个简单的方法是使用内置的filter()函数,该函数返回应用了过滤器的元素,在您的情况下,它将是行号。在这里使用它 -

function returnObject(eleIndex){
  var obj = {};
  return element.all(by.css('tbody > tr')).filter(function(elem, index){
      return index === eleIndex;
  }).then(function(elem){
      elem[0].$$('td').get(0).getText().then(function(name){
          obj.name = name;
      });
      elem[0].$$('td').get(1).getText().then(function(surname){
          obj.surname = surname;
      });
      elem[0].$$('td').get(2).getText().then(function(address){
          obj.address = address;
      });
    return obj;
    });
};

另一种方法是使用get()功能。这是怎样的 -

function returnObject(eleIndex){
    var elem = element.all(by.css('tbody > tr')).get(eleIndex);
    var obj = {};
    return browser.wait(EC.visibilityOf(elem), 5000).then(function(){
        elem.$$('td').get(0).getText().then(function(name){
            obj.name = name;
        });
        elem.$$('td').get(1).getText().then(function(surname){
            obj.surname = surname;
        });
        elem.$$('td').get(2).getText().then(function(address){
            obj.address = address;
        });
        return obj;
    });
};

在测试规范中使用上述方法对于两者都是相同的,因为它们将一个promise返回给调用函数 -

returnObject(0).then(function(obj){  //Return the object for first <tr> as both get() and filter() are 0 index based functions
    console.log(obj);
});

希望它有所帮助。

相关问题