单Playwright测试中多次调用PlayAudit致浏览器关闭的问题咨询
单Playwright测试中多次调用PlayAudit()的解决方案
能否在单个测试中多次调用PlayAudit()?
你当前使用的playwright-lighthouse@2.2.2版本,默认调用playaudit()后会自动关闭页面/浏览器上下文,因此无法直接在同一个测试流程中连续调用两次——第一次调用后页面已被销毁,后续的locator().click()自然会触发目标页面已关闭的错误。
替代方案
方案1:自定义配置禁用自动关闭页面
该版本的playwright-lighthouse支持通过配置项关闭自动销毁页面的逻辑,你可以在调用时显式指定相关参数,复用同一个页面实例完成多次审计:
const { playAudit } = require('playwright-lighthouse'); const { test } = require('@playwright/test'); test('multi-stage lighthouse audit', async ({ browser }) => { const page = await browser.newPage(); await page.goto('你的目标URL'); // 第一次审计:禁用自动关闭页面/浏览器 await playAudit({ page, thresholds: { performance: 80, accessibility: 90 }, port: 9222, // 指定调试端口,与Lighthouse通信 closeBrowser: false, // 阻止自动关闭浏览器 closePage: false // 阻止自动关闭当前页面 }); // 执行页面操作(不会再报错) await page.locator('目标选择器').click(); await page.waitForNavigation(); // 若点击后有页面跳转,需等待完成 // 第二次审计:复用同一页面实例 await playAudit({ page, thresholds: { performance: 80, accessibility: 90 }, port: 9222, closeBrowser: false, closePage: false }); // 测试结束后手动关闭页面 await page.close(); });
注意:如果你的版本默认不支持closeBrowser和closePage参数,可以直接查看playwright-lighthouse的源码,找到审计完成后关闭页面的代码段并注释掉,同样能实现复用页面的效果。
方案2:用独立页面上下文模拟多阶段审计(妥协方案)
如果修改配置或源码存在困难,可在同一个浏览器实例下创建多个页面上下文,分别完成不同阶段的审计。但这种方式无法完全模拟同一个用户会话的连续操作(比如登录状态、缓存会丢失),若业务场景依赖会话状态,需要额外处理(比如保存并恢复Cookie):
const { playAudit } = require('playwright-lighthouse'); const { test } = require('@playwright/test'); test('multi-stage audit with separate pages', async ({ browser }) => { // 第一阶段:初始页面审计 const page1 = await browser.newPage(); await page1.goto('你的目标URL'); await playAudit({ page: page1 }); await page1.close(); // 第二阶段:模拟点击后的页面审计 const page2 = await browser.newPage(); await page2.goto('你的目标URL'); // 若需要保持会话状态,此处可添加恢复Cookie的逻辑 await page2.locator('目标选择器').click(); await page2.waitForNavigation(); await playAudit({ page: page2 }); await page2.close(); });
方案3:升级依赖版本(长期最优解)
你当前因导入问题使用降级版本,若后续能解决导入问题,建议升级到playwright-lighthouse的最新版本——新版本已修复自动关闭页面的设计缺陷,支持在同一个页面实例中多次调用审计方法,无需额外配置即可满足需求。
总结
- 现有降级版本下,可通过配置禁用自动关闭或修改源码实现单页面多次审计;
- 若无法调整库逻辑,多页面上下文方案可作为临时替代,但需处理会话状态;
- 解决导入问题后升级依赖是最简洁的长期方案。
内容的提问来源于stack exchange,提问作者user3517391
相关产品推荐
相关产品推荐

