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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:42:03