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 中,现在可以作为注入依赖项自由传递。