Команда cy.contains() в Cypress предназначена для поиска
элементов на странице по текстовому содержимому. Она
является мощным инструментом для работы с динамическими элементами, где
идентификаторы или классы могут быть нестабильными, а текстовая метка
остаётся уникальной и постоянной.
Базовый синтаксис команды выглядит следующим образом:
cy.contains(content)
cy.contains(selector, content)
cy.contains(content, options)
cy.contains(selector, content, options)
content — текст, который необходимо
найти на странице. Может быть строкой или регулярным выражением.selector — (необязательный)
CSS-селектор, ограничивающий область поиска.options — дополнительные параметры
поиска (например, { matchCase: true } для учёта
регистра).Пример базового поиска элемента по тексту:
cy.contains('Войти').click()
В данном случае Cypress ищет первый видимый элемент на странице, содержащий текст “Войти”, и выполняет по нему клик.
Команда cy.contains() позволяет сначала сузить область
поиска до определённого селектора, а затем искать текст внутри него:
cy.contains('form', 'Отправить').click()
Здесь поиск будет производиться только внутри
<form> элементов. Это особенно полезно, когда на
странице встречаются одинаковые тексты, но в разных контекстах.
Регулярные выражения позволяют реализовать гибкий поиск текста, не зависящий от точного совпадения.
Примеры:
cy.contains(/^Войти$/) // точное совпадение
cy.contains(/войти/i) // нечувствительный к регистру поиск
cy.contains(/Отправ.*/i) // поиск текста, начинающегося с "Отправ"
Регулярные выражения упрощают тестирование динамического текста, частично совпадающего с шаблоном.
optionsОсновные опции для cy.contains():
matchCase — учитывает регистр при
поиске (true или false).timeout — время ожидания появления
элемента. По умолчанию Cypress ожидает до 4 секунд, но опция позволяет
увеличить ожидание для медленных страниц.Пример использования:
cy.contains('Загрузить', { matchCase: true, timeout: 10000 }).click()
cy.contains() можно комбинировать с цепочкой команд:
cy.contains('Товары')
.parent() // переходим к родительскому элементу
.find('button') // ищем кнопку внутри родителя
.click()
Такая цепочка позволяет точечно воздействовать на элементы, которые иначе сложно однозначно идентифицировать.
cy.get()cy.get() ищет элементы по селекторам,
игнорируя текст.cy.contains() ищет по тексту, что
упрощает работу с кнопками, ссылками и динамическими метками.Иногда комбинируют оба метода:
cy.get('ul.menu').contains('Контакты').click()
Сначала ограничивается область поиска ul.menu, затем
выбирается элемент с текстом “Контакты”.
display: none или
visibility: hidden).cy.contains('Добавить в корзину').click()
cy.contains('Ошибка при входе').should('be.visible')
cy.contains('div.card', 'JavaScript для начинающих')
.find('button.buy')
.click()
cy.contains(/войти/i).click()
cy.contains() там, где текст уникален и
стабилен, чтобы не полагаться на динамические классы или ID.cy.contains() для поиска элементов с
очень большим количеством текста, лучше ограничить область поиска
селекторами.cy.contains() является ключевым инструментом для
взаимодействия с элементами на основе текста и значительно упрощает
создание тестов для пользовательских интерфейсов, где идентификаторы
нестабильны, но текст остаётся постоянным.