Playwright测试运行缓慢求助:Selenium迁移后性能未达预期
Playwright性能优化方案
1. 复用Playwright与Browser实例
你当前的测试代码每个用例都重复初始化Playwright、Browser实例,这是最核心的性能浪费点。Playwright的Browser实例属于重量级资源,启动耗时极高,正确做法是在所有测试全局初始化一次,测试结束后统一销毁。
以xUnit为例,可通过IClassFixture实现全局复用:
public class PlaywrightFixture : IDisposable { public IPlaywright Playwright { get; private set; } public IBrowser Browser { get; private set; } public PlaywrightFixture() { Playwright = Playwright.CreateAsync().GetAwaiter().GetResult(); Browser = Playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions { Headless = true, Args = new[] { "--disable-gpu", "--no-sandbox", "--disable-dev-shm-usage" } }).GetAwaiter().GetResult(); } public void Dispose() { Browser?.CloseAsync().GetAwaiter().GetResult(); Playwright?.Dispose(); } } // 测试类关联Fixture实现复用 public class SpeedTests : IClassFixture<PlaywrightFixture> { private readonly IBrowser _browser; public SpeedTests(PlaywrightFixture fixture) { _browser = fixture.Browser; } [Fact] public async Task SpeedTest() { // 每个测试仅创建轻量级的Context和Page using var context = await _browser.NewContextAsync(); var page = await context.NewPageAsync(); await page.GotoAsync("https://www.google.co.uk/"); } }
2. 优化浏览器启动参数
添加以下参数可降低资源占用、提升启动速度:
--disable-gpu:无头模式下禁用GPU加速,减少不必要开销--no-sandbox:关闭沙箱机制,缩短启动时间(仅建议测试环境使用)--disable-dev-shm-usage:避免低内存环境下的资源不足问题--single-process:单进程运行,减少进程创建开销
3. 控制并行测试资源
并行测试时无限制创建实例会导致CPU/内存过载,反而拖慢速度:
- 根据CPU核心数限制并行测试数量,避免过度并行
- 若测试场景允许,可复用
BrowserContext(注意规避测试状态污染风险)
4. 调整页面加载等待策略
默认GotoAsync会等待页面完全加载(Load事件),可根据需求调整为更轻量的等待策略:
await page.GotoAsync("https://www.google.co.uk/", new PageGotoOptions { WaitUntil = WaitUntilState.DOMContentLoaded });
也可以直接等待目标交互元素出现后再继续,比等待全页加载更高效。
5. 尝试更轻量的浏览器
Chromium已是Playwright中速度较快的选项,但部分场景下WebKit的启动速度会更优,可根据测试需求尝试切换。
内容的提问来源于stack exchange,提问作者Keiggo
相关产品推荐
相关产品推荐

