.NET+Selenium测试报错:Object reference not set to an instance of an object
解决Selenium页面对象模式下的空引用异常(Object reference not set to an instance of an object)
看起来你在使用页面对象模式时踩了两个常见的坑:没有初始化页面对象元素,加上定位符配置错误,导致PageTitle始终是null,访问它的Displayed属性时触发了空引用异常。下面一步步帮你解决:
1. 关键问题:未用PageFactory初始化元素
Selenium的[FindsBy]属性不是自动生效的——你需要调用PageFactory.InitElements()来完成标记元素的延迟初始化,否则这些IWebElement会一直保持null状态。你的两种写法都漏掉了这一步。
修复页面对象类
先给你的LandingPageCode加个构造函数,在里面初始化元素:
public class LandingPageCode { private readonly IWebDriver _driver; public LandingPageCode(IWebDriver driver) { _driver = driver; // 这行是核心:把driver和页面对象绑定,初始化所有[FindsBy]标记的元素 PageFactory.InitElements(driver, this); } // 这里的定位符要改成实际匹配页面元素的规则,后面会详细说 [FindsBy(How = How.Id, Using = "PageTitle")] public IWebElement PageTitle { get; set; } }
2. 测试代码的执行顺序错误
第一种写法的顺序完全搞反了:你先实例化了LandingPageCode,但此时driver还没被赋值(是null),导致页面对象里的driver无效,后续再初始化driver也救不了。正确的顺序必须是:
- 初始化ChromeDriver
- 打开目标URL
- 实例化页面对象(此时driver已经正常工作,能正确定位元素)
修复后的测试代码
// 正确的执行流程 driver = new ChromeDriver(); driver.Url = "My URL"; // 多余的括号可以去掉 landingPage = new LandingPageCode(driver); // 现在可以安全访问PageTitle的属性了 Assert.IsTrue(landingPage.PageTitle.Displayed);
3. 定位符配置完全错误
你两种写法里的TagName定位都不符合HTML规范:
- 第一种用
"PageTitle"作为标签名,HTML里根本没有这个标签 - 第二种用
"HomePage"同理,也是不存在的标签
你需要根据页面实际元素调整定位方式:
- 如果元素的ID是PageTitle,改成
[FindsBy(How = How.Id, Using = "PageTitle")] - 如果是页面的标题文本(比如
<h1 class="page-title">),可以用[FindsBy(How = How.CssSelector, Using = "h1.page-title")] - 如果是浏览器标签栏的标题,别用元素定位,直接用
driver.Title获取,因为<title>元素在<head>里,Displayed属性会返回false
额外提醒
- 确保你的项目安装了
Selenium.SupportNuGet包,PageFactory是这个包里的类,没装的话赶紧装:Install-Package Selenium.Support - 尽量不要直接暴露页面对象里的元素,封装成方法更安全,比如:
public bool IsPageTitleVisible() { // 空值判断,避免异常 return PageTitle != null && PageTitle.Displayed; }
内容的提问来源于stack exchange,提问作者CalAtk
相关产品推荐
相关产品推荐

