我正在尝试通过使用ContextInjection
和Specflow使用IObjectContainer
。我在一个解决方案中有多个项目(这是我的项目所必需的),所以我认为这可能是原因。 Base
,PageObjects
和Steps
位于不同的项目。
我可以注册webdriver实例并进行其他项目吗?我尝试使用specflow尝试,但是没有用。
[调试时甚至都没有输入Steps
类。编译时,它将跳过.feature
文件上的所有步骤行,并在末尾引发异常:BoDi.ObjectContainerException: 'Interface cannot be resolved: OpenQA.Selenium.IWebDriver
。
当我删除构造函数时,它至少会转到Steps
类上的定义方法。
在这里:
BaseTest
类:
[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
类:
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
类:
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);
}