如何阻止Playwright每次执行test语句后重新打开浏览器
问题原因
Playwright 默认开启了测试隔离机制:每个独立的test块运行时,都会自动创建全新的浏览器上下文、页面实例,用例执行结束后自动销毁所有实例,所以会出现每条测试都重新打开浏览器的情况。你当前的写法每个test都注入了默认的独立page参数,自然无法共享同一个页面会话。
解决方案
有两种常用方案可以实现同一会话下连续执行多个测试用例:
方案1:手动共享页面实例(推荐)
将关联的测试用例放到同一个test.describe.serial块中,手动声明全局的页面实例,仅在所有用例执行前初始化一次:
// 把关联用例包进serial块,保证用例按顺序执行 test.describe.serial('订阅流程测试', () => { // 声明全局共享的page变量 let page; let commonAction; let navigationAction; let newsletterAction; // 所有用例执行前仅初始化一次页面 test.beforeAll(async ({ browser }) => { const context = await browser.newContext(); page = await context.newPage(); // 提前实例化公共对象,不用每个用例重复创建 commonAction = new CommonAction(); navigationAction = new NavigationAction(); newsletterAction = new NewsletterAction(); }); // 所有用例执行完后销毁上下文 test.afterAll(async () => { await page.context().close(); }); test('When user logs in', async () => { await commonAction.gotoPage(page); await expect(page).toHaveURL('https://uat.mercator.createit.dev/login'); await commonAction.login( page, janEmail, janPasswd ); }); test('Then user is in my account page', async () => { await navigationAction.verifyAccountPage(page); }); test('When user goes to newsletter subscriptions', async () => { await navigationAction.goToNewsSubscription(page); }); test('Then user is in Newsletter subscription page', async () => { await navigationAction.verifyNewsletterPage(page); }); test('When user updates subscription', async () => { await newsletterAction.subscribe(page); }); test('Then user is redirected to My Account page after subscription updates', async () => { // 注意你原代码此处漏传了page参数,需要补上 await navigationAction.verifyAccountPage(page); }); })
注意事项
- 要用
test.describe.serial包裹关联用例,避免用例并行执行导致状态混乱 - 所有用例不要注入默认的
page参数,直接使用块内声明的全局共享page即可
方案2:关闭测试隔离
如果不想修改现有用例的写法,可以在测试块顶部直接关闭当前范围的测试隔离配置:
test.describe('订阅流程测试', () => { // 关闭当前describe内的测试隔离,所有用例自动共享同一个上下文和页面 test.use({ isolation: false }); // 后面直接放你原来的test代码即可,不需要其他修改 test('When user logs in', async ({page}) => { // 原代码不变 }); // 其余测试用例保持原有写法即可 })
注意事项
- 关闭隔离后用例之间的状态会互相影响,仅建议把强关联的流程用例放在同一个开启了该配置的describe块中
- 不要全局关闭测试隔离,否则所有用例的状态会互相干扰,难以排查问题
内容的提问来源于stack exchange,提问作者kevthedevv
相关产品推荐
相关产品推荐

