当我从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
属性时,InitializeWebDriver
尚未执行,那么Driver
将会是未初始化的(即null)。
为了确保Driver
在使用前已被正确初始化,可以考虑以下方案:
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在构造函数中被初始化,如果必要的话
}
}
确保初始化流程:确保在任何尝试访问BasePage.Driver
之前,WebDriverSupport.InitializeWebDriver
已经被调用。这可能需要检查测试框架的生命周期管理,确保初始化逻辑在所有依赖它的部分之前执行完毕。
设计模式调整:考虑是否有必要将Driver
设计为静态属性。如果每个页面实例应该有独立的驱动程序实例,那么去掉静态修饰符,并在每个页面类的构造函数中传入或初始化Driver
可能更为合适。
IWebDriver
时,应有合适的错误处理逻辑。以上建议应当能帮助您解决驱动程序实例为空的问题。