Вот тут можете глянуть, то что вам выше написали - GitHub - evgmoskalenko/web-qa-java-framework: QA Automation web framework. Java. Maven. Allure., на примере поиска в Google.
Там много конечно чего переделать надо, писал тот вариант давненько, но там точно есть пейдж обжект паттерн…
Суть паттерна такая:
каждая страница - объект (класс), элементы на этой странице и методы по работе с этими элементами описываются непосредственно в этом классе. Для того, чтобы использовать эти методы, которые относятся непосредственно к этой конкретной странице, надо создать инстанс этой страницы в тесте, и дернуть необходимые методы.
Еще очень правильно, чтобы каждый метод, возвращал вам либо текущий объект страницу, либо возвращал вам тот обьект, на какую страницу будет переход, после выполнения…
Пример:
Главная страница гугла:
public class GoogleHomePage extends BasePage<GoogleHomePage> {
@Override
protected String getUrl() {
return BASE_URL.getValue();
}
@Step("Search '{0}'")
public GoogleSearchResultsPage searchFor(String text) {
$(By.name("q")).val(text).pressEnter();
return googleSearchResultsPage();
}
}
Страница гугла с результатами поиска:
public class GoogleSearchResultsPage extends BasePage<GoogleSearchResultsPage> {
@Step("Get results")
public ElementsCollection getResults() {
return $$("#ires .g");
}
@Step("Get result by index '{0}'")
public SelenideElement getResult(int index) {
return $("#ires .g", index);
}
}
Тест:
@Test(groups = "google_search", priority = 10)
public void someTest() {
GoogleSearchResultsPage results =
googleHomePage().openPage().searchFor("qa automation framework");
results.getResults().find(text("Test automation - Wikipedia"));
}
Фреймворк свой писать можете как хотите. Главное, чтобы ваши тесты были как можно короче и как можно понятнее, и чтобы эти тесты можно было писать быстро и легко поддерживать…
Если обратите внимание, то я абсолютно точно знаю, что после поиска я должен попасть на новую страницу - результаты поиска… Поэтому после выполнения поиска - searchFor(), я возвращаю объект (страницу) - GoogleSearchResultsPage…
Но при этом, не стоит забывать за наследование или композицию. Когда вам надо будет что-то общее, что есть на других страницах - вынести куда-то в одно место, чтобы потом переиспользовать…
К примеру если искать можно абсолютно на всех страницах вашего приложения, и элементы эти не меняются и поиск, то можно вынести метод searchFor() в родительский класс - BasePage… Чтобы его не приходилось копипастить во всех страницах и можно было использовать, и написать реализацию поиска только один раз…
И кстати, постарайтесь сделать так, чтобы в тестах не было драйвера.