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

Playwright调用GoToAsync时触发System.NullReferenceException问题排查

解决方案

核心错误诊断

空引用异常由以下代码问题导致:

  • 拼写+调用错误:CongigReader是ConfigReader的拼写错误,且GetBaseUrl是方法,需用GetBaseUrl("BaseURL")而非索引器语法GetBaseUrl["BaseURL"]
  • ConfigReader逻辑错误:ConfigBuilder是方法,需调用后再取值(ConfigBuilder()[value]),且每次调用都重新构建配置效率低下
  • SpecFlow钩子签名错误:BeforetestRun方法名大小写错误(应为BeforeTestRun),且缺少Task返回类型,导致钩子未被正确执行,playwright或baseUrl未初始化
  • 语法错误:BrowserNewContextOptions的括号不匹配,可能引发运行时异常

修复后的代码

钩子类

public static IPlaywright playwright;
public static string baseUrl;

// 修复方法名和返回类型
[BeforeTestRun]
public static async Task BeforeTestRun()
{
    playwright = await Playwright.CreateAsync();
    // 修复拼写和方法调用
    baseUrl = ConfigReader.GetBaseUrl("BaseURL");
}

[BeforeScenario]
public async Task BeforeScenario()
{
    var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
    {
        Headless = false,
        Args = new[] { "--disable-features" }
    });

    // 修复括号不匹配
    var context = await browser.NewContextAsync(new BrowserNewContextOptions
    {
        IgnoreHTTPSErrors = false
    });

    var page = await context.NewPageAsync();

    // 添加空值校验,提前排查问题
    if (string.IsNullOrWhiteSpace(baseUrl))
        throw new InvalidOperationException("BaseURL未从配置文件正确加载");
    
    await page.GoToAsync(baseUrl);
}

ConfigReader类

public static class ConfigReader
{
    private static IConfiguration _config;

    // 静态构造函数初始化一次配置
    static ConfigReader()
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            // 确保配置文件必须存在,避免静默失败
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
        _config = builder.Build();
    }

    public static string GetBaseUrl(string value)
    {
        return _config[value];
    }
}

额外验证步骤

  1. 右键appsettings.json → 属性 → 设置复制到输出目录为「如果较新则复制」,确保测试运行时能读取到配置文件
  2. 在BeforeTestRun中添加调试输出(如Console.WriteLine(baseUrl)),验证配置是否正确加载
  3. 确认SpecFlow版本支持[BeforeTestRun]静态异步钩子,若版本过低可替换为[BeforeFeature]钩子

内容的提问来源于stack exchange,提问作者Priyanka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:56:07