Я решил проблему в своей собственной среде, добавив экземпляр protected
WebDriver и конструктор protected
в BasePageObject
, который назначает экземпляр WebDriver. Затем ваши другие PageObjects наследуются от BasePageObject, и вы можете реализовать другой конструктор для PageObject, который принимает WebDriver в качестве аргумента.
Когда вы инициализируете PageObjects, вы можете передать экземпляр WebDriver вашего тестового примера в PageObject, чтобы вы моглине нужно будет звонить getDriver()
все время. Вы можете использовать этот экземпляр WebDriver для выполнения действий с вашими PageObjects, а затем ваши тестовые примеры могут вызывать методы PageObject без каких-либо getDriver()
.
. Вот как выглядит мой фреймворк в C #, начиная с BasePageObject
:
public class BasePageObject
{
// protected WebDriver instance
protected IOSDriver<IOSElement> Driver { get; }
protected BasePageObject(IOSDriver<IOSElement> driver)
{
Driver = driver;
}
Затем обычный PageObject обозначается SomePageObject
:
// inherit from BasePageObject
public class SomePageObject : BasePageObject
{
// implement protected constructor from BasePageObject
public SomePageObject(IOSDriver<IOSElement> driver) : base(driver)
{
}
// we can use the PageObject's driver instance as such
public void DoSomethingWithDriver()
{
// this is protected WebDriver instance from BasePageObject above
Driver.FindElement(SomeLocator);
}
}
Теперь, связав все это вместе, вот как это выглядит в тестовом примере:
public class MyTestClass
{
// initialize your driver somehow
IOSDriver<IOSElement> driver = getThreadLocalDriver();
// declare your PageObject, passing in your Driver instance
SomePageObject myPageObject = new SomePageObject(driver);
// now you can call PageObject methods as such
myPageObject.DoSomethingWithDriver();
}
Это все очень обобщенно, и его нужно будет модифицировать в соответствии с вашими потребностями, но это шаблон проектирования, который я использовал во всех моих тестовых средах с хорошими результатами.