我有这个HTML

<tr ng-repeat="row in entityL">
  <td>{{row.Name}}</td>
  <td>{{row.Surname}}</td>
  <td>{{row.Initials}}</td>
  <td>{{row.RolDivisionList.Name}}</td>
</tr>


我想在Protractor中获得一个包含所有这些值的数组,而且我必须访问第一个。

我尝试在页面对象中使用此量角器功能

this.getAllUsers = function() {
  var userList = element.all(by.repeater('row in entityL'));

  return userList.map(function(tr) {
    return {
      name: tr.element(by.binding('row.Name')).getText(),
      surname: tr.element(by.binding('row.Surname')).getText(),
      initials: tr.element(by.binding('row.Initials')).getText(),
      rolDivision: tr.element(by.binding('row.RolDivisionList.Name')).getText()
    };
  });
};


我得到这样的结果

[
   { name : 'Name1', surname : 'Surname1', initials : 'Initials1', rolDivision : 'Rol1' },
   { name : 'Name2', surname : 'Surname2', initials : 'Initials2', rolDivision : 'Rol2' }
]


但是我无法访问它的值,我尝试了array[0]array[0]['name']array[0].namearray.get(0) ...,但没有任何效果。我也尝试用returnmap包裹在[]内,但也没有用。

事实是,我只想要第一个用户,但我做不到,必须返回所有用户,因此,如果您知道如何仅将第一个用户返回到测试中,那也很好。

这是测试代码(只是it):

iit('should return the first user', function() {
  expect(userListPage.getAllUsers()[0]['name']).toBe('Name1');
});


新实验

我用先前的代码尝试了一些实验,试图了解Protractor的工作原理,这就是我得到的。

我将在页面对象中使用以前的HTML和新的量角器功能

var UserListPage = function() {
  this.userList = element.all(by.repeater('row in entityL'));

  this.getFirstUser = function() {
    return {
      name: element(by.binding('row.Name')).getText(),
      surname: element(by.binding('row.Surname')).getText(),
      initials: element(by.binding('row.Initials')).getText(),
      rolDivision: element(by.binding('row.RolDivisionList.Name')).getText()
    };
  };

  this.getUserData = function (tr) {
    return {
      name: tr.element(by.binding('row.Name')).getText(),
      surname: tr.element(by.binding('row.Surname')).getText(),
      initials: tr.element(by.binding('row.Initials')).getText(),
      rolDivision: tr.element(by.binding('row.RolDivisionList.Name')).getText()
    };
  };

  this.getAllUsers = function() {
    return this.userList.map(function(tr) {
      return {
        name: tr.element(by.binding('row.Name')).getText(),
        surname: tr.element(by.binding('row.Surname')).getText(),
        initials: tr.element(by.binding('row.Initials')).getText(),
        rolDivision: tr.element(by.binding('row.RolDivisionList.Name')).getText()
      };
    });
  };
};

module.exports = UserListPage;


现在是所有实验的测试块

it('should test things', function() {
  userListPage.getAllUsers().then(function(array) {
    //First user array
    expect(array[0]).toEqual("");
    //Name of the first user
    expect(array[0].name).toEqual("");
  });

  //Array with all users
  expect(userListPage.getAllUsers()).toEqual("");

  //Name of the first user
  expect(userListPage.getAllUsers().name).toEqual("");

  //undefined
  expect(userListPage.getAllUsers()[0]).toEqual("");

  //Cannot read property 'name' of undefined
  expect(userListPage.getAllUsers()[0].name).toEqual("");



  //.then is not a function
  userListPage.getFirstUser().then(function(array) {});

  //ERROR Process out of memory
  expect(userListPage.getFirstUser()).toEqual("");

  //Name of the first user
  expect(userListPage.getFirstUser().name).toEqual("");

  //undefined
  expect(userListPage.getFirstUser()[0]).toEqual("");

  //Cannot read property 'name' of undefined
  expect(userListPage.getFirstUser()[0].name).toEqual("");



  //.then is not a function
  userListPage.getUserData(userListPage.userList.first()).then(function(array){});

  //ERROR Process out of memory
  expect(userListPage.getUserData(userListPage.userList.first())).toEqual("");

  //Name of the first user
  expect(userListPage.getUserData(userListPage.userList.first()).name).toEqual("");

  //undefined
  expect(userListPage.getUserData(userListPage.userList.first())[0]).toEqual("");

  //Cannot read property 'name' of undefined
  expect(userListPage.getUserData(userListPage.userList.first())[0].name).toEqual("");

});


对于我来说,奇怪的是,此expect(userListPage.getFirstUser()).toEqual("");停止了带有错误的量角器,并且此expect(userListPage.getFirstUser().name).toEqual("");返回正确的值。

有人还能解释为什么会这样吗?

PD:我应该把所有这些放在一个新的问题上吗?

最佳答案

如果DOM中没有具有相同绑定的元素,则无需使用.map()函数就可以获取它。量角器具有用于ng-binding的内置元素定位器。就是这样 -

element(by.binding('row.Name'));


但是,如果还有更多具有相同ng-binding属性的html元素,请使用ElementArrayFinder来获取该元素-

element.all(by.binding('row.Name')).first();


另一种方法是使用其父元素获取元素-

element.all(by.repeater('row in entityL')).element(by.binding('row.Name')); //Get only the first element with that binding


关于您的研究新问题,您的expect(userListPage.getFirstUser()).toEqual("");返回错误,因为函数getFirstUser()返回一个对象,并且您必须获取该对象的键才能访问键的值,在这种情况下,您应该使用.name来获取用户名。因此expect(userListPage.getFirstUser().name).toEqual("");返回正确的答案。 More on objects in Javascript

希望能帮助到你。

关于javascript - 在 Protractor 中从 map 创建数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33263240/

10-09 20:38