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]; } }
额外验证步骤
- 右键
appsettings.json→ 属性 → 设置复制到输出目录为「如果较新则复制」,确保测试运行时能读取到配置文件 - 在
BeforeTestRun中添加调试输出(如Console.WriteLine(baseUrl)),验证配置是否正确加载 - 确认SpecFlow版本支持
[BeforeTestRun]静态异步钩子,若版本过低可替换为[BeforeFeature]钩子
内容的提问来源于stack exchange,提问作者Priyanka
相关产品推荐
相关产品推荐

