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

Selenium WebDriver: полное руководство
онлайн, начало 19 октября
Логи как инструмент тестировщика
онлайн, начало 22 октября
Школа для начинающих тестировщиков
онлайн, начало 122 октября
Тестирование REST API
онлайн, начало 22 октября
Фотография

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 176 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


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

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


  • 1

#3 Spock

Spock

    Гуру

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

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

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


  • 1

#4 MrArty

MrArty

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

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

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

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


  • 0

#5 user12

user12

    Специалист

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


Отправлено 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 176 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


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

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

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


  • 0

#8 EugeneL

EugeneL

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

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

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

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

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

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


  • 0

#9 TatyanaV

TatyanaV

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

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


Отправлено 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
  • 99 сообщений

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

@TatyanaV, @MrArty

 

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

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

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

 

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


  • 0

#12 TatyanaV

TatyanaV

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

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


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

@TatyanaV, @MrArty

 

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

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

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

 

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

 

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

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

 

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

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


  • 0


Selenium 2.0: стартовый уровень
онлайн, начало 9 ноября
Программирование на Java для тестировщиков
онлайн, начало 12 октября
Автоматизация функционального тестирования
онлайн, начало 5 октября
Selenium WebDriver: полное руководство
онлайн, начало 19 октября



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

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

Яндекс.Метрика
Реклама на портале