开发者社区 问答 正文

使用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:52:29 266 分享 版权
阿里云 AI 助理回答

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

问题分析

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

  2. 初始化时机不匹配:从代码逻辑看,WebDriverSupport.InitializeWebDriver方法负责创建ChromeDriver实例并注册到容器,这是在测试场景开始前执行的。然而,如果在调用BasePage构造函数或访问Driver属性时,InitializeWebDriver尚未执行,那么Driver将会是未初始化的(即null)。

解决建议

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

  1. 延迟加载:修改BasePage中的Driver属性实现为惰性初始化模式,确保首次访问时才去容器中获取或创建实例。这样可以避免直接访问静态未初始化的成员。
public abstract class BasePage
{
    private static IWebDriver _driver;
    public static IWebDriver Driver 
    { 
        get 
        {
            if (_driver == null)
            {
                // 这里需要一种机制来从IObjectContainer中获取webdriver实例
                // 假设有一个全局访问点可以获取objectContainer
                var container = GetObjectContainer(); // 实现此方法以获取正确的对象容器
                _driver = container.Resolve<IWebDriver>();
            }
            return _driver; 
        }
    }

    protected BasePage()
    {
        // 确保Driver在构造函数中被初始化,如果必要的话
    }
}
  1. 确保初始化流程:确保在任何尝试访问BasePage.Driver之前,WebDriverSupport.InitializeWebDriver已经被调用。这可能需要检查测试框架的生命周期管理,确保初始化逻辑在所有依赖它的部分之前执行完毕。

  2. 设计模式调整:考虑是否有必要将Driver设计为静态属性。如果每个页面实例应该有独立的驱动程序实例,那么去掉静态修饰符,并在每个页面类的构造函数中传入或初始化Driver可能更为合适。

注意事项

  • 确保对象容器的生命周期管理与页面基类的使用相协调,避免并发或生命周期不一致的问题。
  • 考虑异常处理,当无法从容器中解析IWebDriver时,应有合适的错误处理逻辑。

以上建议应当能帮助您解决驱动程序实例为空的问题。

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