You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:45:00