来自外部程序集的 Specflow 绑定不起作用,无法加载程序集文件或程序集

Specflow Bindings from External Assemblies is not working and Could not load assembly file or assembly

我正在尝试通过 IObjectContainer 和 Specflow 来使用 ContextInjection。 我在一个解决方案中有多个项目(我的项目是必需的),所以我认为这可能是原因。 BasePageObjectsSteps 放置在不同的项目上。

我可以注册webdriver实例并通过其他项目携带吗?我尝试使用 specflow,但没有用。

调试的时候连Stepsclass都不输入。编译时,它会跳过 .feature 文件上的所有步骤行并在末尾抛出异常:BoDi.ObjectContainerException: 'Interface cannot be resolved: OpenQA.Selenium.IWebDriver.

当我删除构造函数时,它至少会转到 Steps class.

上的定义方法

编辑: 实际上这甚至没有找到[Bindings]。我注意到将这些 Hooks 放在同一个项目中,效果很好。所以我发现这可能与 Specflow External Assembly 中的绑定有关。我试图用这些信息配置 app.config 但它没有用。 这是我放在 app.config:

上的代码
<specFlow>
  <stepAssemblies>
    <stepAssembly assembly="AssemblyNameOfMyProject" />
  </stepAssemblies>
</specFlow>

在此之后,我现在得到:

Techtalk.Specflow error: Could not load assembly file or assembly

开始了:

BaseTest class:

    [Binding]
    public class BaseGUITest
    {
        public IWebDriver driver;

        public IObjectContainer container;

        public BaseGUITest(IObjectContainer container)
        {
            this.container = container;
        }


        [BeforeScenario(Order = 0)]
        public void BrowseInitialize()
        {

            driver = new ChromeDriver();
            container.RegisterInstanceAs<IWebDriver>(driver);

        }

Page class:

namespace PageObjects
{
    public class SearchPage
    {
        private readonly IWebDriver driver;


        public SearchPage(IWebDriver driver)
        {
            this.driver = driver;
        }

         public IWebElement GetTxtSearch()
        {
            return driver.FindElement(By.Name("q"));
        }

}

Steps class:

namespace Features
{
    [Binding]
    public class SearchSteps
    {
        private readonly SearchPage searchPage;

        public SearchSteps(IWebDriver driver)
        {
            searchPage= new SearchPage(driver);
        }

        [Given(@"I am on search home ")]
        {
           . . .
        }

您可以使用 specflow 中的钩子绑定来做到这一点,它非常强大,具体取决于您的情况和绑定。在你的情况下,界面看起来像 IWebDriver

[BeforeFeature]
    public static void RegisterConcreteType(IObjectContainer objectContainer)
    {
        var myClass = new class();
        objectContainer.RegisterInstanceAs<Iinterface>(myClass);
    }