当我从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);
}
}
我认为我在实例启动之前就已经获得了价值。你说什么?由于所有调用都使用基类,因此这是一个问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您的描述,问题在于BasePage
类中的静态Driver
属性在实例化之前就被尝试访问,而实际上驱动程序实例是在WebDriverSupport
类中通过InitializeWebDriver
方法创建并注册到对象容器的。这导致在BasePage
的构造或使用过程中,Driver
属性可能还未被正确初始化,从而出现空值。
静态属性与实例化顺序: 静态属性属于类级别,不依赖于类的实例。在您的场景中,BasePage.Driver
是静态的,这意味着它不绑定到任何特定实例,且其值对于所有BasePage
及其子类的实例共享。
初始化时机不匹配: WebDriverSupport.InitializeWebDriver
方法在测试场景开始前执行,用于初始化ChromeDriver
实例并注册到对象容器。然而,如果在该初始化过程完成之前,有代码尝试通过BasePage.Driver
访问驱动程序,此时Driver
尚未被赋予实际的webdriver
实例,因此会得到空值。
为了确保Driver
属性在使用前已被正确初始化,可以考虑以下方案:
避免直接使用静态属性: 考虑将Driver
设计为非静态成员,并确保在需要使用它的类中通过依赖注入或其他方式正确传递和初始化。这样可以更好地控制实例化流程,保证依赖项在使用前准备就绪。
确保初始化流程的完整性: 确保在任何尝试访问Driver
之前,InitializeWebDriver
已经被调用且成功完成了驱动程序的初始化及注册。可以通过调整测试框架的配置或生命周期管理来保证这一点。
使用初始化检查: 如果静态属性的设计不可更改,可以在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
实例。
通过上述调整,您可以更安全地管理驱动程序实例的生命周期,避免因初始化时机不当导致的空引用问题。