📁 Урок "PageObjects"

  1. Объектно-ориентированная парадигма для построения модели для тестов

Задание

Провести рефакторинг своего теста на регистрацию студента по форме https://demoqa.com/automation-practice-form, используя инструменты объектно-ориентированной парадигмы для инкапсуляции деталей реализации бизнес-шагов пользователя, таким образом реализовав идеи шаблона PageObject.

  1. В этой части мы рассматриваем как ценный c точки зрения бизнеса шаг пользователя – «заполнение отдельных данных о пользователе» или «подтверждение результата проделанной работы» (как например, подтверждение что регистрация прошла успешно):
    • Все элементы выносить в отдельные поля объекта класса не обязательно, но стоит это сделать с теми элементами, которые будут повторяться.
    • Класс для PageObject должен лежать в выделенном модуле в выделенном пакете внутри проекта.
  2. В этой части мы рассматриваем как ценный c точки зрения бизнеса шаг пользователя – «отправить форму с данными» или другими словами «провести регистрацию через форму». Также шагом считаем подтверждение результата проделанной работы (как например, подтверждение, что регистрация прошла успешно). Также в этой части следует провести рефакторинг работы с данными пользователя, представив их в виде объекта датакласса:
    • Не обязательно на уровне с высокоуровневыми шагами типа .register(user) добавлять в PageObject средне-уровневые шаги типа .fill_email(user.email), но можно, если их добавлять - то возможно их стоит сделать "приватными" (добавив перед именем подчеркивание), чтобы не дать возможность в тесте – миксовать подход, а использовать только высокоуровневые шаги.
    • Вероятно, проще вместо добавления таких средне-уровневых шагов – добавить в init поля объекта для всех элементов и переиспользовать их внутри реализации .register(user). Таким образом реализация будет более лаконичная и все еще достаточно гибкая, чтобы в будущем иметь доступ к элементам в контексте других "бизнес задач" на этой странице.
    • Классы для PageObject и модели данных должны лежать в выделенных модулях в выделенных пакетах внутри проекта.
    • При реализации модели данных для реализации тех или иных полей будет неплохо использовать специальные типы данных, например, для даты использовать datetime.date, а для хобби использовать Enum.
  3. Добавить в проект тест на упрощенную регистрацию через форму https://demoqa.com/text-box и соответствующий PageObject:
    • Реализовать шаблон ApplicationManager для предсоздания всех объектов для пейдж-обджектов.
    • В тесте загрузить форму не через simple_registration_form.open(), а через app.left_panel.open_simple_registration_form(), который должен быть шорткатом (методом, вызывающим под капотом другой метод этого же объекта) на app.left_panel.open('Elements', 'Text Box').
    • Соответственно добавить пейджобджект для LeftPanel и создать его объект в виде поля обьекта апликейшен-менеджера.
    • Тесты сгруппированы по классу, который они тестируют.
    • Каждый тест называется именем соответствующего ему метода.

Решение

Первый тест на регистрацию студента лежит в основной ветке.

  1. Первое задание лежит в бренче mid-level-step-objects
  2. Решение второго задания ледит в бренче high-level-step-objects
  3. Третье задание лежит в бренче application-manager (without left_panel)

Дополнительные материалы

  1. О синтаксисе классов в Python: «Инструментарий для работы с классами в Python»
  2. Мартин Фаулер о PageObject
  3. Рекомендации и общепринятые договоренности в подборе имен (Python)
  4. Примеры тестов разного стиля с и без применения PageObject
  5. Примеры более сложных PageObject-ов для контролов
  6. И тестов с ними