Playwright不稳定测试中测试钩子的实例化顺序与生命周期疑问
测试钩子生命周期与你的不稳定问题解析
首先,你的测试出现不稳定的核心原因,是afterEach钩子没有正确处理异步操作。
非并行模式下的测试钩子正常执行顺序
在非并行运行时,describe块内的测试是严格按顺序串行执行的,完整流程是:
- 执行当前测试的
beforeEach(如果是异步函数,会等待所有异步操作完成才进入下一步) - 执行当前测试用例(同样等待测试内所有异步操作完成)
- 执行当前测试的
afterEach(如果是异步函数,必须等待内部异步操作完成,才会进入下一个测试的流程) - 重复上述步骤执行下一个测试用例
你的代码问题出在哪?
看你写的afterEach:
test.afterEach(() => { p.close(); })
p.close()是一个异步方法(Playwright的Page.close()返回Promise),但你的afterEach是同步函数——调用p.close()后,钩子不会等待这个异步操作完成,直接结束。这就导致:前一个测试的页面还在关闭过程中,下一个测试的beforeEach已经开始创建新页面,两个页面的资源操作发生冲突,最终引发不稳定问题。
修复方案
把afterEach改成异步函数,并用await等待页面关闭完成:
test.describe("...", () => { let p: Page; test.beforeEach(async({browser}) => { p = await (await browser.newContext()).newPage(); }); test(...); test(...); test.afterEach(async () => { await p.close(); }); });
这样就能保证前一个页面完全关闭后,才会执行下一个测试的beforeEach,彻底解决不稳定问题。
内容的提问来源于stack exchange,提问作者lef
相关产品推荐
相关产品推荐

