我们使用Specflow和Selenium WebDriver运行一系列UI测试。一夜之间突然停止工作,现在在每个场景上抛出以下错误:
BoDi.ObjectContainerException:无法解析接口:OpenQA.Selenium.IWebDriver(解析路径:步骤类)
我们在每个场景之前使用Specflow Context Injection注册我们的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作为我们的测试运行者,并通过nuget获得所有最新更新。
答案 0 :(得分:3)
我的猜测是你在ProductSteps类上有另一个可能先前运行的BeforeScenario挂钩,并且强制创建实例的时间早于触发其他BeforeScenatio,因此web驱动程序尚未注册。
您可以控制挂钩执行的顺序,您可以使用属性的Order
参数(请参阅http://www.specflow.org/documentation/Hooks/):[BeforeScenario(Order = 0)]
。
您还可以在http://gasparnagy.com/2016/08/specflow-tips-customizing-dependency-injection-with-autofac/查看我的帖子,该帖子使用Autofac为更复杂的依赖关系提供更强大的解决方案。
答案 1 :(得分:1)
事情不会停止工作过夜。
我会看看昨天和今天之间的变化。您是否更新了使用的任何软件包?与您的IOC有关的任何变化?您的错误消息指向该方向。
尝试回滚到它仍在工作时所拥有的内容并逐一进行更改以查看导致问题的原因。然后你可以从那里拿走它。
答案 2 :(得分:0)
我在https://stackoverflow.com/a/26402692/10148657找到了解决方法。基本上,我摆脱了 RegisterInstanceAs 并将IWebDriver包装在SeleniumContext类中,现在可以将其作为注入的依赖项自由传递。