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

Page Object и проверка внезапно возникающей страницы


(Александр Шиповалов) #1

Коллеги, добрый день. Использую Page Object паттерн (в расширении Html Element). Собственно говоря возникла такая задача. Исходные данные. Есть страница с какой то формой для поиска. Забиваешь в нее данные жмешь Submit и возвращается страница с результатами поиска. С этим все понятно. Но есть ряд тест-кейсов - для которых Expected result страница с сообщением об ошибке причем в двух вариантах:

  1. Просто белая страница, в которой сообщение содержится в тегах h4 в в вот таком блоке .search-results-intro
  2. Вроде бы настоящая страница с результатами поиска, но в верхней части в div no_results, тоже будет сообщение об ошибке.
    Считывание данных у нас происходит из Exel и заказчик, захотел поле где он проставив Yes или No, будет определять нужна ему страница с ошибкой (pass) или это реальная ошибка (fail). Пока даже не могу представить, можно ли как то это реализовать через Page Object, ведь я не могу вызвать из одного конструктора объекты двух классов.
    Может кто нибудь сталкивался с похожей проблемой.

(Sergey Korol) #2

Плохо… очень плохо расписали требования.
Это не проблема, если помнить об ООП. Тут либо наследование напрашивается с ErrorPage родителем + 2 child pages (ваши 2 состояния). Либо - композиция, когда ваш эрор представляется в виде отдельного компонента и встраивается в пейджу. А в зависимости от того, где мы сейчас находимся (результирующий пейдж), возвращает текст по одному из двух локаторов. В общем, вариантов решения достаточно.


(Александр Шиповалов) #3

В силу недостатка опыта спрошу - вы бы какой вариант выбрали?:slight_smile:


(Sergey Korol) #4

Да тут и опыта особого не нужно. Оба варианта достаточно простые в имплементации. В первом случае можно даже обойтись без абстрактной страницы и заменить ее интерфейсом с методом получения текста ошибки. В обоих пейджах он будет переопределен, а в зависимости от возвращаемого типа будет вызываться нужный геттер. Можно вообще забить на все, создать 2 локатора и, в зависимости от результирующей страницы, вытягивать текст из нужного. Если конечно в тех страницах больше ничего не нужно кроме эрора. Я ведь не знаю всех нюансов, посему могу лишь выдвигать предположения.


(Александр Шиповалов) #5

Хм…мне нравится идея с интерфейсами…попробую


(Александр Шиповалов) #6

Хотя сомнения остаются. Итак я создал интерфейс с одним единственным методом

public interface ErrorPage {

    public String getErrorMessage();
}

Есть два класса реализующих его

public class BlankErrorPage implements ErrorPage {
    @Override
    public String getErrorMessage() {
        return null;
    }
}

public class lResultsPage extends PageBase implements ErrorPage

Но мои сомнения остаются при мне. Если есть всего один метод

 ResultsPage ResultsPage = HomePAge.startSearch();

который может вернуть или ту или другую страницу - как выйти из этой ситуации.


(Sergey Korol) #7
ErrorPage resultsPage = HomePage.startSearch();

При условии, что public ErrorPage startSearch(). В зависимости от условия внутри метода, произойдет ветвление:

if (isBlankPage) {
    return new BlankErrorPage();
} else {
    return new ResultsPage();
}

Из Java basics: объекты классов, реализующих интерфейс, могут иметь тип этого самого интерфейса:

ErrorPage blankErrorPage = new BlankErrorPage();
ErrorPage resultsPage = new ResultsPage();

Далее, при вызове getErrorMessage() будет использован метод, переопределенный в классе, объект которого вы вернули из startSearch().


(Александр Шиповалов) #8

То есть в интерфейсе ErrorPage, так же должен быть определен и переопределен в классах реализующих этот интерфес метод
startSearch()
или я что то не так понял


(Sergey Korol) #9

Ваш метод должен возвращать тип интерфейса. Но в зависимости от возвращаемого объекта, вы будете ссылаться на конкретную имплементацию getErrorMessage().


(Максим Малунов) #10

У нас сделано примерно так .
switch если title такой возвращаем такой объект .

Тут либо наследование напрашивается с ErrorPage родителем + 2 child pages (ваши 2 состояния). - выбран вот это вариант


(Александр Шиповалов) #11

Я на основе вышеприведенных советов, взял за основу не наследование от ErrorPage (все страницы унаследованы от классе Page), а реализацию интерфейса ErrorPage, вроде что то начало получаться.


(Sergey Korol) #12

Не забудьте отписаться о результатах. :wink:


(Максим Малунов) #13

Собственно еще можно сделать поиск элемента через перечисление локаторов (в CSS через ,)
и взять getText и смотреть чего там получилось .