Переключение на элемент iframe на примере видео-плеера

Итак, в прошлый раз мы рассмотрели, как можно без особых проблем выкатить рабочую страницу на 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!

09f2d7ca2931c44c82d58b5a71d858f6.png

Отлично, наш тест работает! Какие еще методы для поиска 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

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

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

Habrahabr.ru прочитано 4543 раза