IWebDriver остается на уровне класса базового теста. Он может передаваться в условные Navigation (используется .Navigate().GoToUrl()), в какие-то другие helpers (скажем, JavaScript executor), но в page object драйвер приходит в качестве ISearchContext. Это позволяет мне иметь один базовый класс SearchContextWrapper и для page object (всей страницы, «родитель» — корень DOM, IWebDriver) и для element object (логической части страницы, «родитель» — один из элементов страницы, IWebElement). И IWebElement, и IWebDriver реализуют ISearchContext. И на уровне SearchContextWrapper я не разделяю кем именно он является, ибо это уже становится не важным.
А если передавать IWebDriver, то приходится делить на что-то типа PageObject(IWebDriver parent) и PageElement(IWebElement paren, IWebDriver driverWillUseForWait). Можно, конечно, упороться и сделать PageElement(By paren, IWebDriver driverWillUseForSearchAndWait), но зачем, если есть ISearchContext.
Я отнюдь не претендую на избавление ExpectedConditions или изменение WebDriverWait. Я говорю о том, что в один момент я понял, что «тяну» за собой экземпляр драйвера только лишь потому, что он мне нужен в WebDriverWait. И вместо этого я попробовал найти альтернативу.
Я скажу более, экземпляр драйвера вообще не нужен внутри Page Object (как тебе такое, Илон Маск? (с)). Вполне можно обойтись ISearchContext. Но в реализации этой идеи есть два камня преткновения: WebDriverWait и Actions. И если с первым решение есть, то со вторым надо еще побороться.
Перефразируя свою мысль, я бы сказал, что возвращаемое значение только ради FindElement и существует. В случае bool и FindElements оно не несет смысловой нагрузки.
А если передавать IWebDriver, то приходится делить на что-то типа PageObject(IWebDriver parent) и PageElement(IWebElement paren, IWebDriver driverWillUseForWait). Можно, конечно, упороться и сделать PageElement(By paren, IWebDriver driverWillUseForSearchAndWait), но зачем, если есть ISearchContext.
Как-то так. А вообще это тема отдельной статьи :)
Я скажу более, экземпляр драйвера вообще не нужен внутри Page Object (как тебе такое, Илон Маск? (с)). Вполне можно обойтись ISearchContext. Но в реализации этой идеи есть два камня преткновения: WebDriverWait и Actions. И если с первым решение есть, то со вторым надо еще побороться.