开发者社区 问答 正文

使用Page对象模式设计时,驱动程序具有空值

当我从BasePage属性获取值时,驱动程序具有空值:

public abstract class BasePage
{
    public static IWebDriver Driver { get; }
    public BasePage(IWebDriver driver)
    {

    }
}

驱动程序实例是在其他类中创建的

[Binding]
public class WebDriverSupport
{
    private readonly IObjectContainer objectContainer;
    private ChromeDriver webdriver;

    public WebDriverSupport(IObjectContainer objectContainer)
    {
        this.objectContainer = objectContainer;
    }

    [BeforeScenario]
    public void InitializeWebDriver()
    {
        this.webdriver = new ChromeDriver();
        objectContainer.RegisterInstanceAs<IWebDriver>(webdriver);
    }
}

我认为我在实例启动之前就已经获得了价值。你说什么?由于所有调用都使用基类,因此这是一个问题。

展开
收起
保持可爱mmm 2019-11-18 09:46:54 455 分享 版权
阿里云 AI 助理回答

根据您的描述,问题在于BasePage类中的静态Driver属性在实例化之前就被尝试访问,而实际上驱动程序实例是在WebDriverSupport类中通过InitializeWebDriver方法创建并注册到对象容器的。这导致在BasePage的构造或使用过程中,Driver属性可能还未被正确初始化,从而出现空值。

问题分析

  1. 静态属性与实例化顺序: 静态属性属于类级别,不依赖于类的实例。在您的场景中,BasePage.Driver是静态的,这意味着它不绑定到任何特定实例,且其值对于所有BasePage及其子类的实例共享。

  2. 初始化时机不匹配: WebDriverSupport.InitializeWebDriver方法在测试场景开始前执行,用于初始化ChromeDriver实例并注册到对象容器。然而,如果在该初始化过程完成之前,有代码尝试通过BasePage.Driver访问驱动程序,此时Driver尚未被赋予实际的webdriver实例,因此会得到空值。

解决建议

为了确保Driver属性在使用前已被正确初始化,可以考虑以下方案:

  1. 避免直接使用静态属性: 考虑将Driver设计为非静态成员,并确保在需要使用它的类中通过依赖注入或其他方式正确传递和初始化。这样可以更好地控制实例化流程,保证依赖项在使用前准备就绪。

  2. 确保初始化流程的完整性: 确保在任何尝试访问Driver之前,InitializeWebDriver已经被调用且成功完成了驱动程序的初始化及注册。可以通过调整测试框架的配置或生命周期管理来保证这一点。

  3. 使用初始化检查: 如果静态属性的设计不可更改,可以在BasePage中添加逻辑,检查Driver是否已初始化,如未初始化则抛出异常或进行相应处理。但这种方法并不彻底解决根本问题,只是增加了错误处理机制。

示例代码修改(非静态成员方案)

public abstract class BasePage
{
    protected IWebDriver Driver { get; private set; }

    protected BasePage(IWebDriver driver)
    {
        Driver = driver;
    }
}

[Binding]
public class WebDriverSupport
{
    // ... 其他代码保持不变 ...

    public void InitializePageObjectDependencies(BasePage page)
    {
        this.objectContainer.RegisterInstanceAs(page, page.GetType());
    }
}

在测试类或步骤定义中,通过依赖注入的方式确保BasePage及其子类在使用前已经绑定了正确的IWebDriver实例。

通过上述调整,您可以更安全地管理驱动程序实例的生命周期,避免因初始化时机不当导致的空引用问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: