До сих пор не пользовался Селенидом, но возникла необходимость его применения и на первых порах столкнулся с проблемой. Дело в том, что я привык явно задавать драйвер и передавать его инстанцию всем PageObject'ам, которые инициализирую, а там дальше уже обо всём заботится PageFactory. Тут же получается нет такой необходимости? Я не задаю явно вебдрайвер и тем не менее по умолчанию запускается Firefox. Это конечно неплохо, но как инициализировать PageObject'ты? Нашёл в документации вот это:
GoogleSearchPage searchPage = open("/login", GoogleSearchPage.class);
А как поступать тогда со страницами, которые наследуют (extends) этот класс? У меня никак не получается это сделать. Я к тому же использую аннотации @FindBy, но получаю в итоге NullPointer при обращении к элементам. Может кто-нибудь приведёт пример?
Приведу пока свой пример:
Это основной класс
public class ParentClass{ @FindBy(xpath="//button[@class='test']") private SelenideElement myButton; ..... .... .... public ChildClass getSomeTab(){ myButton.click(); return new ChildClass(); } }
Это класс который наследует от основного
public class ChildClass extends ParentClass{ @FindBy(id="someId") private SelenideElement header; ..... ..... ..... public String getHeaderText(){ return header.getText(); } }
Теперь сам тест, который благополучно падает с NullPointer'ом при попытке получить текст из элемента на дочернем объекте.
@Test public void dummyTest(){ ParentClass myPage = Selenide.open(mySiteURL, ParentClass.class); ChildClass someTab = myPage.getSomeTab(); assertEquals(someTab.getHeaderText(), "Expected Text"); }
Очевидно, селенид не передаёт объект драйвера дочернему классу, но как это сделать правильно, сохранив структуру и логику объектов? С PageFactory мне достаточно было передавать объект драйвера который я создал ранее в конструктор класса и делать initPageElements();