![](/img/trans.png)
[英]protractor: follow up to another thread regarding how to handle locators that return array in page object model
[英]How to create and return an array of objects using protractor page object model design and promises
我正在创建一个页面 object model ,其中一个属性是表中的所有用户。 该表有几列,所以我想解析该表并为每一行创建一个用户 object,然后返回该集以用于测试。 到目前为止,我的页面 object 的属性如下所示:
users: {
get: function() {
let userRecords = [];
var users = element.all(by.repeater('user in users')).each(function(tr, index) {
let user = {
name: tr.element(by.css('td:nth-child(2)')).getText().then(text => {return text;}),
role: tr.element(by.css('td:nth-child(3)')).getText().then(text => {expect(text).toBeTruthy();}),
status: tr.element(by.css('td:nth-child(4)')).getText().then(text => {expect(text).toBeTruthy();}),
//actionsButton: tr.element(by.css('btn btn-default'))
};
userRecords += user;
}).then(userRecords => {return userRecords});
return userRecords;
}
},
通过反复试验,我在尝试打印以筛选userRecords
的每个元素时遇到了两种结果之一:
undefined
或userRecords is not defined
。重申一下,我只是想构建一个数组,将每个用户保存为 object,然后能够在我的测试中对该集合进行迭代/过滤。
鉴于我正在采用的方法,构建此用户数组并解决承诺的理想方法是什么?
编辑:值得注意的是,如果我在每个getText().then()
语句中执行console.log()
,它确实会从表中打印正确的数据。 所以,我知道它正在正确读取表格。
我会 go 使用返回 json 的方法,并使其异步
users: async function() {
let userRecords = [];
var users = element.all(by.repeater('user in users'));
for (let i = 0; i < await users.count(); i++) {
let tr = users.get(i);
let user = {
name: await tr.element(by.css('td:nth-child(2)')).getText(),
role: await tr.element(by.css('td:nth-child(3)')).getText(),
status: await tr.element(by.css('td:nth-child(4)')).getText()
};
userRecords.push()
}
return userRecords;
},
然后使用:
console.log(
JSON.stringify(
await constructorName.users()
)
)
应该就这么简单。 请注意,我没有测试代码,但根据我的经验,我确实使用了这种方法。 所以它可能需要一些小的修改
一般来说,尽量避免使用.then
- async/await
更容易使用, .each
- go 用for
循环代替。 还有userRecords += user;
没有做你认为的事情(尽管我在这里可能错了)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.