IWebDriver 的 Specflow 上下文注入失败
Specflow Context Injection of IWebDriver failing
我们有一套 UI 测试 运行 使用 Specflow 和 Selenium WebDriver。一夜之间,这些突然停止工作,现在在每个场景中抛出以下错误:
BoDi.ObjectContainerException : Interface cannot be resolved: OpenQA.Selenium.IWebDriver (resolution path: Steps class)
我们在每个场景之前使用 Specflow 上下文注入来注册我们的 webdriver,然后我们在每个步骤中使用它 类:
[Binding]
public class Base
{
private readonly IObjectContainer _objectContainer;
private IWebDriver _webDriver;
public Base(IObjectContainer objectContainer)
{
_objectContainer = objectContainer;
}
[BeforeScenario]
public void Setup()
{
_webDriver = new ChromeDriver();
_objectContainer.RegisterInstanceAs<IWebDriver>(_webDriver);
}
....
}
步骤文件:
[Binding]
public class ProductSteps : TechTalk.SpecFlow.Steps
{
private readonly IWebDriver _driver;
public ProductSteps(IWebDriver driver)
{
_driver = driver;
}
}
在线查看 Specflow 文档,我没有发现任何问题 - 而且我也找不到任何可以向遇到此问题的人展示的东西!
我花了相当多的时间试图弄清这个问题的真相,但没有任何运气。
我们使用 NUnit 作为我们的测试 运行ner 并通过 nuget 获得所有最新更新。
事情不会一夜之间就停止工作。
我会看看昨天和今天之间发生了什么变化。您是否更新了任何使用的软件包?与您的国际奥委会有关的任何变化?您的错误消息指向那个方向。
尝试回滚到它仍在运行时的状态,并逐一进行更改以查看导致问题的原因。然后你可以从那里拿走它。
我的猜测是您在 ProductSteps class 上有另一个 BeforeScenario 挂钩,它可能 运行 更早并强制在触发其他 BeforeScenatio 之前创建实例,因此网络驱动程序是尚未注册。
可以控制钩子的执行顺序,可以使用属性的Order
参数(见http://www.specflow.org/documentation/Hooks/):[BeforeScenario(Order = 0)]
.
您还可以在 http://gasparnagy.com/2016/08/specflow-tips-customizing-dependency-injection-with-autofac/ 查看我的 post,它使用 Autofac 提供了更强大的解决方案,具有更复杂的依赖关系。
我在这里 找到了解决方案。基本上我摆脱了 RegisterInstanceAs 并将 IWebDriver 包装在 SeleniumContext class 中,现在可以作为注入依赖项自由传递。
我们有一套 UI 测试 运行 使用 Specflow 和 Selenium WebDriver。一夜之间,这些突然停止工作,现在在每个场景中抛出以下错误:
BoDi.ObjectContainerException : Interface cannot be resolved: OpenQA.Selenium.IWebDriver (resolution path: Steps class)
我们在每个场景之前使用 Specflow 上下文注入来注册我们的 webdriver,然后我们在每个步骤中使用它 类:
[Binding]
public class Base
{
private readonly IObjectContainer _objectContainer;
private IWebDriver _webDriver;
public Base(IObjectContainer objectContainer)
{
_objectContainer = objectContainer;
}
[BeforeScenario]
public void Setup()
{
_webDriver = new ChromeDriver();
_objectContainer.RegisterInstanceAs<IWebDriver>(_webDriver);
}
....
}
步骤文件:
[Binding]
public class ProductSteps : TechTalk.SpecFlow.Steps
{
private readonly IWebDriver _driver;
public ProductSteps(IWebDriver driver)
{
_driver = driver;
}
}
在线查看 Specflow 文档,我没有发现任何问题 - 而且我也找不到任何可以向遇到此问题的人展示的东西!
我花了相当多的时间试图弄清这个问题的真相,但没有任何运气。
我们使用 NUnit 作为我们的测试 运行ner 并通过 nuget 获得所有最新更新。
事情不会一夜之间就停止工作。
我会看看昨天和今天之间发生了什么变化。您是否更新了任何使用的软件包?与您的国际奥委会有关的任何变化?您的错误消息指向那个方向。
尝试回滚到它仍在运行时的状态,并逐一进行更改以查看导致问题的原因。然后你可以从那里拿走它。
我的猜测是您在 ProductSteps class 上有另一个 BeforeScenario 挂钩,它可能 运行 更早并强制在触发其他 BeforeScenatio 之前创建实例,因此网络驱动程序是尚未注册。
可以控制钩子的执行顺序,可以使用属性的Order
参数(见http://www.specflow.org/documentation/Hooks/):[BeforeScenario(Order = 0)]
.
您还可以在 http://gasparnagy.com/2016/08/specflow-tips-customizing-dependency-injection-with-autofac/ 查看我的 post,它使用 Autofac 提供了更强大的解决方案,具有更复杂的依赖关系。
我在这里 找到了解决方案。基本上我摆脱了 RegisterInstanceAs 并将 IWebDriver 包装在 SeleniumContext class 中,现在可以作为注入依赖项自由传递。