У вас слишком много вещей, происходящих в одной иерархии классов. Было бы намного проще отделить следующие вещи:
- Веб-драйвер
- Объекты страницы
- Определения шагов
Выможно использовать инфраструктуру внедрения зависимостей SpecFlow, чтобы связать эти вещи вместе, используя аргументы конструктора.
Сначала ваш класс Hooks, где вы управляете экземпляром веб-драйвера для всех определений шагов и объектов страницы:
[Binding]
public class Hooks
{
private IObjectContainer container;
public Hooks(IObjectContainer container)
{
this.container = container;
}
[BeforeScenario]
public void CreateWebDriver()
{
var driver = new ChromeDriver();
container.RegisterInstanceAs<IWebDriver>(driver);
}
[AfterScenario]
public void DestroyWebDriver()
{
var driver = container.Resolve<IWebDriver>();
driver.Quit();
driver.Dispose();
}
}
Иобъект страницы поиска Google становится отдельным классом, который получает объект веб-драйвера в качестве параметра конструктора, который разделяет его со SpecFlow вместе.
public class GoogleSearchPage
{
private readonly IWebDriver driver;
private IWebElement TxtSearch => driver.FindElement(By.Name("q"));
public GoogleSearchPage(IWebDriver driver)
{
this.driver = driver;
}
public void EnterSearchTerm(string searchTerm)
{
TxtSearch.SendKeys(searchTerm);
}
}
И, наконец, класс определения шага, в котором все подключаетсявместе с помощью инфраструктуры внедрения зависимостей, которая поставляется вместе с SpecFlow:
[Binding]
public class GoogleSearchSteps
{
private GoogleSearchPage googleSearch;
public GoogleSearchSteps(IWebDriver driver)
{
googleSearch = new GoogleSearchPage(driver);
}
[When(@"I fill the '(.*)' field")]
public void WhenIFillTheField(string search)
{
googleSearch.EnterSearchTerm(search);
}
}
Часть проблемы, которая у вас есть сейчас, - это иерархия классов. Вы смешиваете классы, которые должны быть разделены, но скоординированы. Отделяя определения шагов от инициализации веб-драйвера и сохраняя объект страницы в своем собственном классе, вы сохраняете зависимости между этими объектами организованными и ограниченными ровно тем, что им нужно (развязка), и все же позволяете им работать вместе (когезия).