Playwright 中的页面对象没有 return 选择器
Page object does not return selector in Playwright
使用微软的剧作家,我有这个有效的测试代码:
describe('When a user views a list of forms', () => {
let rows;
before(async() => {
await page.waitForSelector('tbody');
rows = await page.$$('tr');
});
it('should show a table of forms', async() => {
rows.length.should.equal(11);
});
我想把它分解成一个页面对象。我有这个作为我的页面对象
class UserFormsPage {
constructor(page) {
this.page = page;
}
async rows() {
await this.page.waitForSelector('tbody');
return await this.page.$$('tr');
}
}
这是我的测试:
describe.only('List Forms Widget', function() {
let page;
...
before(async function() {
const context = await this.browser.newContext();
page = await context.newPage();
const userFormsPage = new UserFormsPage(page);
...
describe('When a user views a list of forms', () => {
let rows;
...
before(async() => {
rows = await userFormsPage.rows();
});
it('should show a table of forms', async() => {
rows.length.should.equal(11);
});
但我明白了
1) List Forms Widget
When a user views a list of forms
"before all" hook for "should show a table of forms":
TypeError: Cannot read property 'rows' of undefined
这是为什么?
注意:如果重要的话,在 Node 16 中使用原生 es 模块
您的 rows()
方法是异步的。每个异步方法 returns 一个承诺,所以在你的钩子中,rows = userFormsPage.rows();
只会导致 Promise { <pending> }
.
如果你想要这个号码,你必须等待它:
before(async () => {
rows = await userFormsPage.rows();
});
另一个问题似乎是您没有(至少在您的问题中没有)任何 UserFormsPage
对象的创建。构造函数期望 page
,但您似乎没有提供它。
使用微软的剧作家,我有这个有效的测试代码:
describe('When a user views a list of forms', () => {
let rows;
before(async() => {
await page.waitForSelector('tbody');
rows = await page.$$('tr');
});
it('should show a table of forms', async() => {
rows.length.should.equal(11);
});
我想把它分解成一个页面对象。我有这个作为我的页面对象
class UserFormsPage {
constructor(page) {
this.page = page;
}
async rows() {
await this.page.waitForSelector('tbody');
return await this.page.$$('tr');
}
}
这是我的测试:
describe.only('List Forms Widget', function() {
let page;
...
before(async function() {
const context = await this.browser.newContext();
page = await context.newPage();
const userFormsPage = new UserFormsPage(page);
...
describe('When a user views a list of forms', () => {
let rows;
...
before(async() => {
rows = await userFormsPage.rows();
});
it('should show a table of forms', async() => {
rows.length.should.equal(11);
});
但我明白了
1) List Forms Widget
When a user views a list of forms
"before all" hook for "should show a table of forms":
TypeError: Cannot read property 'rows' of undefined
这是为什么?
注意:如果重要的话,在 Node 16 中使用原生 es 模块
您的 rows()
方法是异步的。每个异步方法 returns 一个承诺,所以在你的钩子中,rows = userFormsPage.rows();
只会导致 Promise { <pending> }
.
如果你想要这个号码,你必须等待它:
before(async () => {
rows = await userFormsPage.rows();
});
另一个问题似乎是您没有(至少在您的问题中没有)任何 UserFormsPage
对象的创建。构造函数期望 page
,但您似乎没有提供它。