如何使用量角器页面对象模型设计和承诺创建和 return 对象数组
How to create and return an array of objects using protractor page object model design and promises
我正在创建一个页面对象模型,其中一个属性是 table 中的所有用户。 table 有几列,所以我想解析 table 并为每一行创建一个用户对象,然后将 return 设置为在测试中使用。到目前为止,这是我的页面对象 属性 的样子:
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
.
重申一下,我只是想构建一个数组,将每个用户作为一个对象保存,然后能够在我的测试中对该组进行迭代/过滤。
考虑到我所采用的方法,构造此用户数组并解决承诺的理想方法是什么?
编辑:值得注意的是,如果我在每个 getText().then()
语句中执行 console.log()
,它确实会从 table 中打印出正确的数据。所以,我知道它正在正确读取 table。
我会采用 returns 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
- 使用 for
循环代替。另外 userRecords += user;
并没有按照你的想法去做(虽然我在这里可能是错的)
我正在创建一个页面对象模型,其中一个属性是 table 中的所有用户。 table 有几列,所以我想解析 table 并为每一行创建一个用户对象,然后将 return 设置为在测试中使用。到目前为止,这是我的页面对象 属性 的样子:
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
.
重申一下,我只是想构建一个数组,将每个用户作为一个对象保存,然后能够在我的测试中对该组进行迭代/过滤。
考虑到我所采用的方法,构造此用户数组并解决承诺的理想方法是什么?
编辑:值得注意的是,如果我在每个 getText().then()
语句中执行 console.log()
,它确实会从 table 中打印出正确的数据。所以,我知道它正在正确读取 table。
我会采用 returns 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
- 使用 for
循环代替。另外 userRecords += user;
并没有按照你的想法去做(虽然我在这里可能是错的)