Объектная модель страницы, насколько дискретны методы? - PullRequest
1 голос
/ 05 апреля 2019

Итак, я внедряю PoM в новом проекте, это будет мой первый раз.Я использую Capybara с Rspec (Selenium) для написания своих фреймворков.

Одна вещь, с которой я продолжаю сталкиваться, это то, насколько «дискретными» должны быть методы в моих объектных классах Page.Когда дело доходит до этого, я вижу два хода мысли:

Давайте возьмем страницу, которая создает виджет:

Вариант 1 (обобщенный, более сфокусированный на том, что будет делать пользователь)

class WidgetPage

   def click_widgets_tab
        click_on('Widgets')
    end

    def create_widget_button
        click_on('Add Widget')
    end

    def enter_widget_name(name)
        fill_in 'Widget Name', with: name
    end

    def enter_widget_type(type)
        fill_in 'Widget Type', with: type
    end

    def widget_success?
        expect(page).to have_content('.alert', text: 'Widget Successfully created!')
    end
end

(Методы «Заполнить», вероятно, можно даже объединить в указанном выше случае

или вариант 2:

class WidgetPage

    def click_widgets_tab
        widget_tab_link.click
    end

    def create_widget_button
        widget_add_element.click
    end

    def enter_widget_name(name)
        widget_form_name.fill_in(name)
    end

    def enter_widget_type(type)
        widget_form_type.fill_in(type)
    end

    def widget_success?
        widget_success_alert.has_text? 'Widget successfully created!'
    end


    private

    def widget_add_element
        find_button('Widget')
    end

    def widget_form_name
        find_field('Widget Name')
    end

    def widget_form_type
        find_field('Widget Type')
    end

    def widget_tab_link
        find_link('Widgets')
    end

    def widget_success_alert
        find(.alert, text: "Widget successfully created!")
    end

end

Мне кажется, что я вижу большинство учебных пособий по объектам страницыиспользуйте вариант 2 ... но кажется, что для небольшого возврата вложенных средств требуется много дополнительного кода. Наличие методов для возврата элементов имеет смысл для меня, если они используются в нескольких методах ... но не для каждого метода.

Также, что касается утверждений, вариант 1 имеет больше смысла. Но я также слышал, что у вас не должно быть утверждений в объекте страницы. Так что, возможно, имеет больше смысла просто иметь метод, который возвращает ли оповещениеНапример, видим или нет? Все еще не уверен, что лучший способ справиться с этим.

1 Ответ

1 голос
/ 09 апреля 2019

Я думаю, что это справедливый вопрос, многие из них сводятся к предпочтениям, но есть некоторые вполне реальные ловушки, с которыми вы можете столкнуться, если выберете неправильное «предпочтение» для вашей ситуации, поэтому я думаю, что стоит поговоритьabout.

  • Частичное мнение: Если ваше приложение нестабильно / изменчиво / склонно к необходимости обходных путей, рассмотрите более детализированные методы в объектах страницы и меньше Capybara в определениях шагов.Очень раздражает, что на этом шаге десятки page.element.click() вызовов определяют, что все они должны быть обновлены, потому что приложение меняется и требует зависания перед каждым кликом.Если это действие обернуто в объекте страницы как page.clickElement(), то у вас есть единственное место, чтобы сделать это обновление (или реализовать обходной путь).
  • В основном мнение: если вы оберните абсолютно все, что Capybara может сделать для каждогоэлемент, вы получите в итоге раздутый объект страницы, который трудно использовать.Если есть набор действий, которые будет использовать step defs в 90% случаев, я представлю их как явные методы и позволю оставшимся 10% действиям типа edge-case использовать элементы напрямую.
  • Частичномнение: Имейте в виду, что методы click_on / fill_in Капибары ограничивают вас в использовании их концепции локатора (имени, идентификатора или метки).Я всегда считал это настолько ограничительным, по сравнению с произвольным CSS, что я избегал их использования.
  • Меньше мнений: избегайте помещать утверждения в объекты страницы!Объекты страницы являются абстракцией для страницы, а не тестом бизнес-правила.В приведенном выше примере оба параметра потерпят неудачу с плоским «не удалось найти элемент» или «false! = True», что не очень полезно.Вместо этого рассмотрите возможность возврата текста (каким бы он ни был) из объекта страницы и подтверждения этого в шаге def.

Что-то вроде

def get_widget_alert
    find(.alert).get_text()
end

Вызывается из шага def как

expect(widget_page.get_widget_alert).to eq('Widget Successfully created!')

Сбой с полезным сообщением, если кто-то решит изменить пунктуацию или регистр сообщения в будущем.

...