Перейти к содержимому

Фотография

Page Object и одинаковые локаторы


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 11

#1 MrArty

MrArty

    Новый участник

  • Members
  • Pip
  • 4 сообщений

Отправлено 22 ноября 2017 - 11:43

О гуру и просто опытные специалисты, прошу вашей помощи. :help:

В данный момент в тестинге используется связка Cucumber+Selenide+Java. Все это заточено под Page Object.

 

Есть классы страниц, есть классы тестов. Вопрос собственно в следующем:

У сайта есть несколько однотипных страниц (Статистики),  которые по сути отличаются только набором фильтров, но есть и общие элементы у каждой из страниц. К примеру кнопка поиска, кнопка сброса фильтров и т.д. Локаторы у них одинаковые.

 

Как правильно спроектировать PageObject сайта с общими для каждой из страниц элементами, чтобы не плодить в каждом page одинаковые элементы, кнопки, поля?

 


  • 0

#2 Little_CJIOH

Little_CJIOH

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 515 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 22 ноября 2017 - 12:04

кроме паттерна Page Object, есть паттерн Element Object, а между ними лежит континуум детализации в виде всевозможных NavigationMenu Object, Footer Object, Search Object. 
Мысль в том, что PO создается не для целой страницы, а для логического куска страницы. Если некоторый кусок присутствует хотя-бы на 2-х страницах с одинаковыми локаторами - это уже повод выделить его в отдельный объект.


  • 1

#3 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 22 ноября 2017 - 12:16

можно общие части выделять в отдельные объекты и потом в пейдж-обжектах наследовать


  • 1

#4 MrArty

MrArty

    Новый участник

  • Members
  • Pip
  • 4 сообщений

Отправлено 22 ноября 2017 - 12:18

Тоже была такая мысль выделить такие элементы в отдельный объект, скажем Controls. Для таких целей подойдет создание обычного класса?


  • 0

#5 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 22 ноября 2017 - 12:36

Тоже была такая мысль выделить такие элементы в отдельный объект, скажем Controls. Для таких целей подойдет создание обычного класса?

 

я слабо себе представляю другой путь.

Вообще если на страницах есть одинаковые(или похожие) элементы - типо Хедера, Футера, различных фильтров их лучше выделять в отдельный класс


  • 1

#6 MrArty

MrArty

    Новый участник

  • Members
  • Pip
  • 4 сообщений

Отправлено 22 ноября 2017 - 12:53

Коллеги спасибо всем за полезные советы! Очень помогли. 


  • 0

#7 Little_CJIOH

Little_CJIOH

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 515 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 22 ноября 2017 - 13:06

можно общие части выделять в отдельные объекты и потом в пейдж-обжектах наследовать

вы хотели сказать компоновать?


  • 0

#8 EugeneL

EugeneL

    Активный участник

  • Members
  • PipPip
  • 101 сообщений

Отправлено 22 ноября 2017 - 13:21

можно общие части выделять в отдельные объекты и потом в пейдж-обжектах наследовать

А могли бы пример привести?

Я занимался тестированием веб-приложений при помощи Selenium Webdriver, но использовал Page Object с разметкой элементов при помощи аннотаций


  • 0

#9 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 28 ноября 2017 - 08:11

 

можно общие части выделять в отдельные объекты и потом в пейдж-обжектах наследовать

А могли бы пример привести?

Я занимался тестированием веб-приложений при помощи Selenium Webdriver, но использовал Page Object с разметкой элементов при помощи аннотаций

 

 

А причем тут аннотации? Они наследованию никак не мешают.

Делаете какую-нибудь абстрактную (в прямом смысле) заготовку с теми элементами, которые на всех тестируемых страницах присутствуют. В этом классе - все нужные элементы (с аннотация или нет, как уж вам удобнее).

Далее, каждая отдельная тестовая страница - просто наследуется от этого абстрактного класса, а в ней самой - описываются только уникальные для неё элементы. 

public abstract class AnyPage {

    @FindBy(css = "#mainFilter")
    WebElement mainFilter;

    public Page doSmthWithMainFilter(String someValue) {
        // do something
        return this;
    }
}

public class StatsPage extends AnyPage {

    @FindBy(css = "#specificFilter")
    WebElement specificFilter;

    public StatsPage doSmthWithSpecificFilter(String someValue) {
        // do something 
        return this;
    }
}


public class AnotherStatsPage extends AnyPage {

    @FindBy(css = "#anotherSpecificFilter")
    WebElement anotherSpecificFilter;

    public AnotherStatsPage doSmthWithAnotherSpecificFilter(String someValue) {
        // do something 
        return this;
    }
}

  • 1

#10 MrArty

MrArty

    Новый участник

  • Members
  • Pip
  • 4 сообщений

Отправлено 28 ноября 2017 - 10:58

 

 

можно общие части выделять в отдельные объекты и потом в пейдж-обжектах наследовать

А могли бы пример привести?

Я занимался тестированием веб-приложений при помощи Selenium Webdriver, но использовал Page Object с разметкой элементов при помощи аннотаций

 

 

А причем тут аннотации? Они наследованию никак не мешают.

Делаете какую-нибудь абстрактную (в прямом смысле) заготовку с теми элементами, которые на всех тестируемых страницах присутствуют. В этом классе - все нужные элементы (с аннотация или нет, как уж вам удобнее).

Далее, каждая отдельная тестовая страница - просто наследуется от этого абстрактного класса, а в ней самой - описываются только уникальные для неё элементы. 

public abstract class AnyPage {

    @FindBy(css = "#mainFilter")
    WebElement mainFilter;

    public Page doSmthWithMainFilter(String someValue) {
        // do something
        return this;
    }
}

public class StatsPage extends AnyPage {

    @FindBy(css = "#specificFilter")
    WebElement specificFilter;

    public StatsPage doSmthWithSpecificFilter(String someValue) {
        // do something 
        return this;
    }
}


public class AnotherStatsPage extends AnyPage {

    @FindBy(css = "#anotherSpecificFilter")
    WebElement anotherSpecificFilter;

    public AnotherStatsPage doSmthWithAnotherSpecificFilter(String someValue) {
        // do something 
        return this;
    }
}

Именно к такой концепции я и пришёл в итоге. Логически очень удобно структурирован проект за счёт этого.


  • 0

#11 EugeneL

EugeneL

    Активный участник

  • Members
  • PipPip
  • 101 сообщений

Отправлено 09 декабря 2017 - 15:33

@TatyanaV, @MrArty

 

Спасибо за ответ. Я думал ранее о чем-то таком, но меня смущало (и смущают до сей поры) 2 момента:

- аннотированные переменные-члены в Java не наследуются от суперкласса, если они не объявляены с аннотацией @Inherited;

- y аннотации @FindBy такой аннотации нет.

 

Соответственно, я предполагал, что переменные абстрактного суперкласса не будут видны WebDriver-у при работе с его потомками.


  • 0

#12 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 09 декабря 2017 - 21:54

@TatyanaV, @MrArty

 

Спасибо за ответ. Я думал ранее о чем-то таком, но меня смущало (и смущают до сей поры) 2 момента:

- аннотированные переменные-члены в Java не наследуются от суперкласса, если они не объявляены с аннотацией @Inherited;

- y аннотации @FindBy такой аннотации нет.

 

Соответственно, я предполагал, что переменные абстрактного суперкласса не будут видны WebDriver-у при работе с его потомками.

 

Аннотация @Inherited помечает аннотацию, которая будет унаследована потомком класса, отмеченного такой аннотацией. ©

Т.е. @Inherited нужна тогда, когда Вы создаете новый класс (например, Car), делаете к нему аннотацию (например, @Drivable) и хотите, чтобы потомки этого класса (например, FormulaCar, PassengerCar, Truck и т.д.) тоже унаследовали эту аннотацию (@Drivable).

 

Аннотацией @FindBy Вы помечаете поля класса (т.е. кучу объектов WebElement), а не весь класс страницы целиком. 

Поэтому ничто не помешает им унаследоваться по указанному выше примеру (а если они не private - то их и использовать можно будет напрямую).


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных