PlayWright 无法截取屏幕截图 - 页面已关闭

PlayWright can't take screenshot - page closed

我正在尝试使用 JestPlayWright 截取失败的测试用例的屏幕截图,处理函数是在自定义环境中定义的,如下所示

const PlaywrightEnvironment = require('jest-playwright-preset/lib/PlaywrightEnvironment')
    .default

class CustomEnvironment extends PlaywrightEnvironment {
    async setup() {
        await super.setup()
    }

    async teardown() {
        await super.teardown()
    }

    async handleTestEvent(event, state) {
        if (event.name === 'test_done' && event.test.errors.length > 0) {
            const parentName = event.test.parent.name.replace(/\W/g, '-')
            const specName = event.test.name.replace(/\W/g, '-')

            await this.global.page.screenshot({
                path: `screenshots/${parentName}_${specName}.png`,
            })
        }
    }
}

module.exports = CustomEnvironment;

但是,每次测试后我都会关闭页面..

afterEach(async () => {
    await page.close();
});

这导致 page 在捕获屏幕截图之前被关闭

Test suite failed to run

page.screenshot: Target page, context or browser has been closedError:

  18 |             const specName = event.test.name.replace(/\W/g, '-')
  19 |
> 20 |             await this.global.page.screenshot({
     |                                    ^
  21 |                 path: `screenshots/${parentName}_${specName}.png`,
  22 |             })
  23 |         }

有没有一种方法可以将事件传递给 afterEach 以便在发生错误时它不会关闭,或者有一种方法可以更同步地获取屏幕截图以便 afterEach 不会请在截图之前执行?

有一些特殊情况,您可能希望在自定义 fixture/config 中使用 page.close(),但根据您的尝试,我不会说您就是这种情况去做。默认情况下,browser/context 会在每次测试后自动关闭,因此也会关闭正在测试的页面。可以看到默认拆机here.

删除您的 afterEach 方法应该可以解决问题。 :)

其他显着特点:

  • 查看 Playwright-Test 以了解自定义 config/fixtures 如何帮助您创建一致的测试环境,(即,如果您希望某些环境截取屏幕截图 only-on-failure 而不是其他环境。
  • Playwright 还支持 page object models -- a feature that makes your tests much more readable and maintainable. I also have an example ,如果有帮助,您可以参考新版 Playwright 的页面对象模型。