我有这个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].name
,array.get(0)
...,但没有任何效果。我也尝试用return
将map
包裹在[]
内,但也没有用。事实是,我只想要第一个用户,但我做不到,必须返回所有用户,因此,如果您知道如何仅将第一个用户返回到测试中,那也很好。
这是测试代码(只是
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/