Итак, в прошлый раз мы рассмотрели, как можно без особых проблем выкатить рабочую страницу на GitHub Pages и попробовать встроить в эту страницу, например, плеер и убедиться, что он работает.

Логично предположить, что следующими этапами будут взаимодействие со встроенными элементами iframe и автоматизация проверок с такими элементами на созданной нами странице.

Для начала давайте немного пройдемся по базе.

"Это база!" (с)
"Это база!" (с)

Что такое iframe? Если объяснять простыми словами, то это еще один html-документ внутри нашей страницы, которая в свою очередь также является html-документом. Таким образом, чтобы взаимодействовать с элементами внутри iframe нужно сначала переключиться на iframe. Проще говоря - мы должны обратиться к этому элементу, как к отдельной странице.

Как именно это сделать? Давайте посмотрим на наиболее простые и действенные методы для поиска iframe на примере страницы, которую я выкатил на GitHub Pages.

Перейдем на страницу https://sergesiluyanov.github.io/embedHabrTest/ и изучим ее структуру:

Структура страницы для тестов
Структура страницы для тестов

Давайте сосредоточимся на кнопке play. Что мы о ней можем сказать? Прежде всего, она имеет атрибут data_testid. Это очень хорошо, поскольку такие атрибуты являются самыми надежными с точки зрения изменений в коде. К примеру, CSS-селектор может быть динамическим и нестабильным от версии к версии и придется каждый раз менять селектор в коде.

Помимо атрибута, мы видим, что кнопка находится внутри элемента iframe на странице. Чтобы "добраться" до этой кнопки нам придется переключиться на содержимое iframe и только потом кликать по кнопке.

Теперь перенесемся в сам код для тестов на GitHub и посмотрим на общую структуру проекта.

Общая структура проекта
Общая структура проекта

На скрине выше показана общая структура проекта, будем использовать фреймворк cypress. Как видите, я использую паттерн page object, то есть все страницы, с которыми я взаимодействую, хранятся как отдельные файлы (объекты). В объектах уже хранятся классы и функции, которые импортируются и вызываются в самих тестах.

Перейдем непосредственно к классу iFramePage:

  1. Функция visit, в которой прописан url нашей страницы.

  2. Функция iFrameButton, которая переключается на элемент iFrame (c помощью src) и кликает на кнопку play.

Сама функция iFramePlayButton сначала ищет элемент iframe, затем переключается на его содержимое для дальнейшей работы с элементами внутри iframe, проверяет, что элемент не пустой, после чего запускается "оборачивание" для команд cypress и обнаруживается наш элемент по data_testid. И, в конце концов, кликаем по элементу с кнопкой play.

Описание класса iFramePage
Описание класса iFramePage

Итак, с классом iFramePage разобрались, теперь попробуем запустить наш первый тест.

Посмотрим, как выглядит наш тест: для начала импортируем класс из объекта с помощью import. После этого начинаем описание нашего теста с describe, далее идет кастомная команда blockAllRequests, в которой указываются только нужные для загрузки домены (убираем все url, которые собирают метрики, например yandex, google и т.д.). Команда BlockAllRequests необходима для оптимизации загрузки, то есть загрузятся только те домены, которые необходимы для нормальной работы самой страницы.

После этого вызываем две функции: visit и iFramePlayButton. Как видите, все предельно просто и понятно. В данной статье пока не накидываю ассерты и проверки, поскольку хотелось бы сосредоточиться именно на работе с iframe-элементами.

Структура теста
Структура теста

Давайте теперь запустим наш тест. Для наглядности используем команду npx cypress open.

Запуск тестов
Запуск тестов

После этого откроется локальный инстанс браузера, в котором выбираем E2E testing in Chrome.

Запуск cypress
Запуск cypress

Теперь кликаем по нашему файлу, в котором прописаны тесты

Файл с тестом
Файл с тестом

А вот и магия: тест выполнился, а видео воспроизводится после клика по кнопке play!

Отлично, наш тест работает! Какие еще методы для поиска iframe-элементов мы можем использовать и что еще добавить к тесту помимо ассертов?

На веб-странице может быть несколько iframe-элементов, при этом нам нужно взаимодействовать только с одним из них или со всеми по очереди. Ниже скриншот с примером реализации альтернативных подходов:

  1. если нам известно имя класса, то находим определенный iframe с нужным именем класса

  2. если нужен первый iframe, то прописываем в nth-of-type(0), если второй, то (1) и т.д.

Пример реализации
Пример реализации

Можно воспользоваться и xpath для поиска iframe, но на реальной web-странице такой селектор может быть очень длинным и неудобным для чтения в коде.

Как видите, в cypress можно легко и просто искать iframe-элементы и взаимодействовать с кнопками внутри него, а запуск в локальном инстансе очень хорошо помогает в дебаге наших тестов.

Стоит упомянуть, что важное значение помимо самих фреймворков (будь то cypress или selenium) имеет также и то, как тесты структурированы. Чем лучше тесты структурированы, тем легче их поддерживать, а коллегам будет гораздо проще разобраться в коде, поэтому не забываем придерживаться общепринятых практик (таких как page object).

Оставляю ссылку на репозиторий для просмотра и более подробного изучения кода тестов - https://github.com/sergesiluyanov/habrIframe

Спасибо за то, что прочитали статью до конца, уверен, что было интересно и наглядно!

Обязательно увидимся в следующих статьях, буду рад комментариям и подпискам!

Комментарии (0)