运行C#自动化测试抛出System.NullReferenceException空引用异常求助
问题根因定位
你遇到的NullReferenceException不是因为CNLoginPage实例为空,堆栈指向第577行userId.SendKeys("TESTER"),空引用来源于两个可能性,按优先级排查:
1. 类内部驱动字段未正确赋值
你实例化CNLoginPage时传入了ConnectNativeDriver,但如果CNLoginPage的构造函数没有把传入的驱动参数赋值给内部的_driver字段,_driver会保持默认值null,调用_driver.GetElementByCssSelector时就会抛出异常。
修复方案:
补全CNLoginPage的构造函数,同时增加空校验提前暴露问题:
public class CNLoginPage { private readonly IWebDriver _driver; // 补全构造逻辑 public CNLoginPage(IWebDriver driver) { _driver = driver ?? throw new ArgumentNullException(nameof(driver), "驱动实例不能为null"); } // 其余原有方法不变 public void PasswordRequired() { // ...原有逻辑 } }
2. 页面元素未找到导致返回值为空
如果_driver已经正确赋值,空引用就来自GetElementByCssSelector("#username")的返回值为null:页面未加载完成、选择器错误、元素在iframe内都会导致找不到元素。
修复方案:
- 先用浏览器F12开发者工具校验
#username选择器是否能匹配到目标输入框 - 增加显式等待,等元素可交互后再操作,避免页面加载速度慢导致的查找失败:
public void PasswordRequired() { var wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(10)); // 等待用户名元素加载完成 var userId = wait.Until(d => d.FindElement(By.CssSelector("#username"))); userId.SendKeys("TESTER"); var password = wait.Until(d => d.FindElement(By.CssSelector("#password"))); password.SendKeys(" "); var enter = wait.Until(d => d.FindElement(By.CssSelector("#AutomatedTesting-loginButton"))); enter.Click(); }
- 如果登录框嵌套在iframe中,需要先调用
_driver.SwitchTo().Frame("iframe的id/name")切换上下文后再查找元素。
额外排查点
确认测试类中的ConnectNativeDriver本身已经完成初始化,没有为null:如果驱动初始化逻辑写在[TestInitialize]标记的方法中,需要确认执行顺序正常,测试方法运行前驱动已经实例化完成。
内容的提问来源于stack exchange,提问作者Kody Berry
相关产品推荐
相关产品推荐

