Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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


(Alex) #1

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

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

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

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

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


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

(Alex) #3

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

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


(Александр Таранков) #4

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

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


(Александр Таранков) #5

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


(Alex) #6

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

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