【问题标题】:Page object does not return selector in Playwright页面对象不返回 Playwright 中的选择器
【发布时间】:2021-08-27 00:20:20
【问题描述】:

使用微软的剧作家,我有这个测试代码可以工作:

  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 模块

【问题讨论】:

    标签: mocha.js e2e-testing playwright


    【解决方案1】:

    您的 rows() 方法是异步的。每个异步方法都会返回一个 Promise,所以在你的钩子中,rows = userFormsPage.rows(); 只会产生 Promise { <pending> }

    如果你想要这个号码,你必须等待它:

    before(async () => {
      rows = await userFormsPage.rows();
    }); 
    

    另一个问题似乎是您没有(至少在您的问题中没有)任何 UserFormsPage 对象的创建。构造函数需要page,但您似乎没有提供它。

    【讨论】:

    • 我更正了,但我仍然收到TypeError: Cannot read property 'rows' of undefined
    • @dman 问题可能出在this.page。我不知道您是如何创建 UserFormsPage 对象的,但请记住将 page 提供给构造函数(const userFormsPage = new UserFormsPage(page) 必须在代码中的某个位置)
    • 是的,我只是尽量在帖子中尽量减少代码
    • 我刚刚更新了帖子里的代码来展示一下
    • @dman: 但const userFormsPage 似乎是在不同的范围内声明的。 constlet 在 JS 中是块作用域的,所以如果你在一个 before 钩子中声明它并尝试在另一个 before 钩子中使用它,它就行不通了。
    猜你喜欢
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多