t.me/atinfo_chat Telegram группа по автоматизации тестирования

В каких случаях выполнять инициализацию новой страницы

Хотелось бы спросить правильно ли выполнять следующее:

Например есть домашняя страница и страница с формой, у нее есть возможность “сохранить и вернуться на домашнюю страницу” и "Сохранить и остаться на главной форме". Например когда мы возвращаемся на главную страницу я думаю разумно было выполнять ее инициализацию:

public HomePage saveAndClose() {
		saveAndClose.click();
		return PageFactory.initElements(driver, HomePage.class);
				
	}

...
public void test{
...
HomePage homepage = karaoke.setName("asd").clickSaveAndClose();
homepage.verifyCard("asd") // проверяем добавилась ли карточка
...
}

А если мы просто нажмем сохранение и останемся на форме, опять же нужно делать инициализацию этой же страницы?

1 Симпатия
  1. Во-первых, если используется initElements для страниц, то он используется не так, что для этой используется, а для той нет, а используется для всех. Следовательно выносится глубоко в пра-прародительскую страницу и не вызывается явно как у тебя показано. А вызывается при каждом создании нового экземпляра каждой страницы
  2. Во-вторых, твой return должен возвращать экземпляр HomePage, следовательно должно быть как-то вот так: return new HomePage(driver). Где во время создания экземпляра как раз будет происходить инициализация
  3. А если мы остаемся на форме, то возвращать надо экземпляр класса текущей страницы. Возвращать ли его как новый экземпляр или как this зависит от того как она будет использована в коде-получателе этого экземпляра страницы. Но обычно можно везде возвращать new

Не совсем понял, почему нужно использовать именно return new HomePage(driver) вместо initElements. Каждый класс практически описывает страницу со своими элементами, которые должны браться когда мы к ним обращаемся. Поэтому я так понял мы и пишем initElements

Еще один вопрос состоит в том что если у каждого метода (сохранить, сохранить и закрыть, перейти в меню). Можно вызвать цикличность: loginPage.loginAs(userData).chooseMenu("Karaoke").addForm().setName("asd").saveAndClose().addForm()... и так до бесконечности, разве это правильно?

InitElements выносится обычно в конструктор базового родительского класса, от которого будут наследоваться все страницы. Соответственно, при вызове new для каждой страницы initElements вызовется неявно. Можно и явно писать, просто зачем?

Ну, вызывай цикличность на здоровье :slight_smile: Только в чём смысл писать тесты на функционал, которого нет в тестируемом приложении?

Ты не пытайся спроектировать фреймворк так, чтобы нельзя было сделать какие-то невозможные вещи. Фреймворк - это инструмент и он должен позволять делать что угодно. Точнее, должен позволять делать всё, что может потребоваться

Все понял. Просто нужно разобраться с тем фактом как писать код правильно. По поводу initElement я так понял просто нужно было задать себе вопрос, “а что если потребуется обратится к классу а в его конструкторе не задан initElements” верно?

А по поводу второго я скорее думал что должно существовать какое либо ограничение на количество инициализации. Чтобы не было возможности вызвать до 10 и больше методов.