Playwright测试在Docker并行模式失败,串行模式正常求助
解决方案:Docker中Playwright并行测试失败问题
针对「Navigation failed because page crashed!」错误
- 限制并行Worker数量:在
playwright.config.ts中降低workers配置,避免资源耗尽。结合你的Docker 8核8G配置,建议设置为固定数值或按CPU比例分配:export default defineConfig({ workers: 4, // 或设置为 '50%',表示使用一半CPU核心数 }); - 增大Docker共享内存:Chrome在Docker环境下依赖足够的共享内存,启动容器时添加
--shm-size=2g参数,或在docker-compose.yml中配置:services: your-service: shm_size: '2gb' - 优化浏览器启动参数:在
playwright.config.ts中添加减少资源消耗的浏览器启动参数:export default defineConfig({ use: { launchOptions: { args: [ '--disable-gpu', '--no-sandbox', '--disable-dev-shm-usage', '--single-process' ] } } });
针对临时文本断言失败问题
- 调整断言逻辑,优先等待最终状态:临时加载文本的出现时机受并行资源波动影响大,建议先等待加载文本消失,再断言目标业务元素状态,而非直接依赖加载文本可见:
// 可选:等待加载文本出现(根据业务场景决定是否需要) await page.getByText("Loading...").waitFor({ state: "visible", timeout: 5000 }); // 等待加载完成(加载文本消失) await page.getByText("Loading...").waitFor({ state: "hidden" }); // 断言最终可交互元素可见 await expect(page.getByRole("button", { name: "确认" })).toBeVisible(); - 使用模糊匹配与延长超时:针对临时文本的细微格式差异(如「Loading..」和「Loading...」),用正则匹配并延长断言超时时间:
await expect(page.getByText(/Loading\.+/, { exact: false })).toBeVisible({ timeout: 10000 }); - 强制上下文完全隔离:显式在每个测试前后创建/销毁浏览器上下文,彻底避免并行测试间的资源竞争:
let page: Page; let context: BrowserContext; test.beforeEach(async ({ browser }) => { context = await browser.newContext(); page = await context.newPage(); }); test.afterEach(async () => { await page.close(); await context.close(); }); - 禁用浏览器实例复用:在
playwright.config.ts中关闭实例复用,确保每个测试使用全新的浏览器实例:export default defineConfig({ use: { launchOptions: { reuseExistingServer: false } } });
内容的提问来源于stack exchange,提问作者utkarsh-k
相关产品推荐
相关产品推荐

