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

.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也救不了。正确的顺序必须是:

  1. 初始化ChromeDriver
  2. 打开目标URL
  3. 实例化页面对象(此时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.Support NuGet包,PageFactory是这个包里的类,没装的话赶紧装:Install-Package Selenium.Support
  • 尽量不要直接暴露页面对象里的元素,封装成方法更安全,比如:
    public bool IsPageTitleVisible()
    {
        // 空值判断,避免异常
        return PageTitle != null && PageTitle.Displayed;
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:10:51