В следующий раз мы научимся конфигурировать выбор браузера и ожидания вне кода автоматизации, используя config-файлы. То есть если уж вы объявляете поля для элементов, то пусть они будут приватными, https://deveducation.com/ а все операции с ними пусть осуществляются через публичные методы. Для этой страницы важным элементом будет заголовок страницы, подтверждающий, что авторизация была успешно завершена.
Из объекта вызываем методы взаимодействия с элементами страницы. В функции описывается верхнеуровневая логика действий пользователя. После этого лучшей стратегией для глубокого понимания страничных объектов является не чтение об объектах страниц, а чтение и понимание принципов проектирования программного обеспечения и паттернов проектирования. Автоматизация тестирования — это разработка программного обеспечения, и все знания, относящиеся к программному обеспечению, относятся и к автоматизации тестирования. Читайте о SOLID, читайте больше о DRY vs DAMP, изучайте все другие паттерны проектирования и как они используются, изучайте функциональное программирование и как эти концепции применяются по-разному, список тем практически бесконечен.
Тесты не должны ничего знать о веб-элементах, не должны оперировать напрямую с XPath или другими селекторами. Тесты должны использовать публичные методы пэдж объекта. Допустим, тестируемое приложение – это ваш личный Gmail-аккаунт, базовая структура POM-фреймворка, где все веб-элементы и применяющиеся к ним методы содержатся в файле класса. Простая задача вроде верификации должна быть отделена, будучи частью тест-методов. Хорошая статья, много нормального разбора ПО а не копирки статей «как написать логин пейдж», было интересно почитать.
Реструктуризация Для Web Page Object
Его имя, DuckDuckGoSearchPage, уникально и внятно определяет страницу. В нем есть атрибуты локаторов (SEARCH_INPUT), инициализатор (__init__) и методы взаимодействия (load и search). Действия над идентифицированными элементами выполняются с использованием методов public void. Это повторяется для обеих страниц тестируемого приложения. Каждый объект страницы будет содержать множество локаторов для соответствующих элементов на этой странице. Видя все локаторы на всех страницах, возникает соблазн собрать эти локаторы в некий централизованный класс Locators, и ссылается на него в каждом Page Object.
Например, объект BasePageObject будет либо объединять, либо компоновать хелперы для работы с базой данных, хелперы для работы с assertion-ами и все остальные хелперы. Таким образом, каждый объект страницы, производный от базового объекта страницы, сразу получает доступ ко всему и всем, что ему может понадобиться. Не имеет смысла дублировать знания о том, как найти элементы в компоненте заголовка, на все объекты страницы, включающие заголовок. Вместо этого создавайте Page Components (компоненты страницы), которые связаны с меньшими частями страниц (в нашем примере — с заголовком).
Хотя такой подход может показаться полезным, это создает раздутые объекты страниц и превращает BasePageObject в God Object. Я не буду описывать как настроить Visual Studio для написания автоматических тестов на Selenium WebDriver об этом вы можете прочитать в соответствующей статье. В мире много различных хороших практик в различных областях и сферах.
Все вызовы WebDriver делаются напрямую внутри тест-функции. Без комментариев этот код будет тяжело читать и понять. Вызовы WebDriver используют контр-интуитивные локаторы с низкоуровневыми командами взаимодействия. Тут отсутствует намерение – это тест поиска DuckDuckGo, а не набор кликов и ввода букв.
Автоматизация Тестирования По
Это понимание паттернов проектирования не диктует каждую деталь ваших страничных объектов. Вот почему автоматизация тестирования требует критического и творческого мышления, свойственного разработке программного обеспечения, и не является шаблонной. Если вы знакомы с любым видом фронтенд-веб-разработки, то, возможно, сталкивались с Document Object Model (DOM). DOM широко признан как тип API для документов HTML и XML, позволяющий получать доступ к логической структуре документа и манипулировать ей.
- В нем есть атрибуты локаторов (SEARCH_INPUT), инициализатор (__init__) и методы взаимодействия (load и search).
- Это понимание паттернов проектирования не диктует каждую деталь ваших страничных объектов.
- Если в определённый момент разработчики изменят id у логотипа, то все one hundred тестов будут заканчиваться неудачей и мне надо будет править все 100 тестов.
- Он пытается решить те же проблемы, что и шаблон объекта страницы, но другим способом.
- Вызовы WebDriver используют контр-интуитивные локаторы с низкоуровневыми командами взаимодействия.
Методы взаимодействия должны иметь интуитивно понятные имена. Метод search вводит поисковый запрос в поле ввода, но теперь фраза параметризована – можно использовать любую фразу. Хочу напомнить, что изначальный смысл Page Objects состоял в том, чтобы инкапсулировать (то есть прятать!) логику работы с элементами.
Но вот про Screenplay хотелось бы более широкий ответ, а не просто упоминание, причем без ссылок на упоминаемую статью и при чем сам паттерн и специфичные технологии? Очевидно что паттерн можно реализовать и с селениумом и с девтулзами и с playwright, и он не зависит от технологии. Этот паттерн как раз и решает много проблем пейдж обжекта, с его большими наследованиями, организацией кода, дублируемости, и читаемость тестов.
Всё просто — есть элементы сайта, которые мной используются многократно в разных тестах. Если разработчик изменит элемент, а он используется мной в one hundred тестах, то мне придётся править 100 мест в коде. При автоматизация ui тестов box использовании Page Object мне достаточно исправить код в одном месте. Это популярный паттерн, который является де-факто стандартом в автоматизации тестирования веб-продуктов. Основная идея состоит в том, чтобы разделить логику тестов от реализации.
В случае входа в систему LoginPage может иметь ссылку на данные, созданные в методе BeforeSuite или BeforeEach и сохраненные в глобальном хранилище «текущей информации о пользователе» для последующего использования. Это может показаться выгодным, но все равно перегружает ответственность объекта страницы. В функции определяем время, которое по умолчанию равно 10-и секундам.
Я лишь показал свой вариант, который прошел боевое крещение и показал свою состоятельность на практике. Надеюсь, что в дальнейшем я найду в себе силы и продолжу описание практических советов по использованию PageObject sample. А Selenide позволяет писать более короткие и читаемые Page Objects. Если вы интересуетесь тест-автоматизацией, то в какой-то момент зададитесь одним (или всеми) из следующих вопросов – что такое Page Object Model (POM)?
Шаблон Page Object Model изолирует несколько типов изменений, самым значительным и очевидным из которых является интерфейс между кодом ваших тестов и DOM приложения. Тесты пользовательского интерфейса должны содержать информацию о том, как находить элементы на страницах. Эта информация имеет тенденцию меняться, и она имеет тенденцию меняться на разных страницах. Каждую веб-страницу проекта можно описать в виде объекта класса.
К тому же локаторы веб-элементов могут дублироваться – например, локатор поисковой строки. Для практического упражнения код ниже идентифицирует элементы домашней страницы BrowserStack, в частности, заголовок страницы. Как упоминалось выше, это делается при помощи аннотации “@FindBy” для обеих страниц тестируемого приложения. Например, шаблон ScreenPlay — это альтернативный вариант, который вращается вокруг акторов, задач, активностей и действий. Он пытается решить те же проблемы, что и шаблон объекта страницы, но другим способом. Cypress Blog выступает за AppActions, хотя мы не совсем согласны с их описанием «проблем страничных объектов», а их реализация полагается на возможности Cypress/DevTools, недоступные для фреймворков на базе WebDriver.
PageObject — не единственный паттерн в автоматизации пользовательского интерфейса. Многие выступают за альтернативные подходы или, по крайней мере, за значительные изменения базового дизайна объектов страницы, с которым мы знакомы. Например, при создании копии объектов страниц (new ItemDetailPage() ) вы можете сделать требованием, чтобы при создании копии объекта проверялось, что браузер находится на ожидаемой странице. Таким образом, конструктор ItemDetailPage будет искать и проверять некоторый элемент или заголовок страницы. Это позволяет тестам «быстро падать», когда что-то идет не так, даже без явного assertion-а на уровне теста. На самом деле вам нужен еще более высокий уровень абстракции, который фактически охватывает объекты страницы.
Тестирование Фронтенда
Page Object — это всего лишь шаблон проектирования, и многие, кажется, забывают об этом. Это не магия и не что-то космическое; это определенная организация кода, которая создает определенные преимущества. Добавляем в абстрактный супер класс Page ссылку на рабочий контекст context, а также сервисный метод для получения из него объекта Selenium getBrowser().
Указываем base_url, который будет использоваться для открытия страницы. После того, как элементы идентифицированы, следующий шаг – инициализировать их, используя сниппет ниже. В тестах дублирование тестовых шагов внутри тестов является довольно распространенным явлением, но польза для читабельности от того, что вы видите каждый шаг внутри теста, перевешивает пользу от рефакторинга этих шагов в одном месте. При широком использовании этот паттерн также делает тесты невероятно сложными для чтения. Он скрывает происходящее и заставляет читателя щелкать по множеству различных мест, чтобы понять ожидаемое поведение теста. Это пересекается с темой DRY vs DAMP, которую мы рассмотрим позже.
Акторы объединяют действия между объектами страницы, чтобы представить эти общие агрегированные действия на страницах в виде многократно используемых фрагментов. Они обеспечивают интерфейс более высокого уровня для тестов. Таким образом, каждому тесту не нужно заново реализовывать эту последовательность, он просто использует интерфейс, предоставляемый актором. Наш тест взаимодействует с двумя страницами – страницей поиска DuckDuckGo и страницей результатов. Создайте новую директорию pages/ в корневом каталоге проекта, и добавьте пустой файл __init__.py, чтобы сделать ее пакетом. В этом пакете вам нужно создать два файла – search.py и end result.py.
Аннотация может найти элементы по tagName, partialLinkText, linkText, name, id, css, xpath, и className. Она также использует метод initElements для инициализации веб-элементов. Этот метод может принимать аргументы, чтобы дать тесту немного больше контроля, но идея понятна. В противном случае они являются просто раздутыми страничными объектами.
Строка ShopperActor.logonAndSelectItem(); говорит мне именно то, что мне нужно знать, чтобы понять, что делает тест. Этот принцип называется DAMP — Descriptive and Meaningful Phrases (понятные и осмысленные фразы). Он отдает приоритет многословию для удобочитаемости, а не дублированию, и должен стать вашим руководящим принципом в тестах. Такова цель каждого паттерна проектирования, о котором вы когда-либо читали. Прикладываю готовый проект с описанными выше примерами. Вообще, вариантов реализации PageObject-ов может много в зависимости от предпочтений того или иного разработчика.