Playwright与.NET集成部署Azure函数应用时触发超时及无头模式问题
解决方案:Azure函数+Playwright超时与无头模式警告问题
一、处理旧无头模式警告
你提到的Playwright暂不支持新无头模式的情况,其实Playwright v1.32及以上版本已经正式支持Chromium新无头模式,如果你的包版本较旧,先升级Microsoft.Playwright包到最新稳定版。
1. 启用新无头模式(推荐)
修改RunPlaywrightTestAsync中的浏览器启动配置,将Headless = true替换为枚举值BrowserHeadless.New:
await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions { Headless = BrowserHeadless.New, // 启用Chromium新无头模式 Timeout = 60000, Args = new[] { "--disable-dev-shm-usage", "--no-sandbox" } });
2. 改用chrome-headless-shell(兼容旧版本)
如果暂时无法升级Playwright,可通过启动参数指定使用chrome-headless-shell,避免旧无头模式的警告:
await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions { Headless = true, Timeout = 60000, Args = new[] { "--disable-dev-shm-usage", "--no-sandbox", "--headless=shell" } });
二、解决超时错误(核心问题)
日志显示浏览器已启动但超时,主要原因是Azure函数消费计划资源有限,同时启动16个Chromium实例导致资源耗尽,可通过以下方式优化:
1. 限制并发测试数量
不要一次性启动16个地区的测试任务,改为分批执行,避免资源竞争:
[FunctionName("CustomAvailabilityTest")] public async Task Run([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, ILogger log, ExecutionContext executionContext) { var batchSize = 4; // 每次执行4个地区的测试,可根据资源调整 for (int i = 0; i < Locations.Length; i += batchSize) { var batchTasks = Locations .Skip(i) .Take(batchSize) .Select(location => RunTestForLocationAsync(location, executionContext.FunctionName, log)) .ToArray(); await Task.WhenAll(batchTasks); } }
2. 复用Playwright实例
每次调用Playwright.CreateAsync()会产生较大开销,改为静态初始化复用实例:
private readonly TelemetryClient _telemetryClient; private static readonly Playwright _playwright; private static readonly string[] Locations = new[] { // ... 你的地区列表 }; static CustomAvailabilityTest() { // 静态初始化Playwright,避免每次测试重复创建 _playwright = Playwright.CreateAsync().GetAwaiter().GetResult(); } public CustomAvailabilityTest(TelemetryConfiguration telemetryConfiguration) { _telemetryClient = new TelemetryClient(telemetryConfiguration); } // 后续RunPlaywrightTestAsync直接使用_playwright private async Task<bool> RunPlaywrightTestAsync(ILogger log) { try { await using var browser = await _playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions { // ... 你的浏览器配置 }); // ... 后续测试逻辑 } // ... 异常处理 }
3. 升级Azure函数计划
消费计划的CPU和内存配额较低,若分批执行仍超时,建议切换到高级计划(Premium Plan)或专用计划(Dedicated Plan),给函数分配更多资源。
4. 检查网络连通性
确认Azure函数的出站网络规则允许访问目标站点(如google.com),若函数部署在VNet中,需配置相应的出站规则或NSG允许外部访问。
三、额外优化建议
- 减少不必要的浏览器启动参数,比如
--disable-setuid-sandbox和--no-sandbox重复了,保留一个即可。 - 可尝试增加浏览器启动超时时间(如90秒),但这只是临时方案,核心还是解决资源问题。
内容的提问来源于stack exchange,提问作者Adarsh Raj
相关产品推荐
相关产品推荐

