Фильтрация элементов является ключевым инструментом при автоматизации тестирования с помощью Cypress, позволяя работать с точными элементами на странице и избегать ненужных взаимодействий с лишними элементами. Cypress предоставляет гибкие методы для выбора и фильтрации DOM-элементов, основываясь на селекторах, содержимом и состоянии элементов.
Cypress включает несколько встроенных методов для точной фильтрации элементов:
.filter() Используется для сужения
набора найденных элементов на основе CSS-селектора или функции.
cy.get('ul li')
.filter('.active') // Оставляет только элементы с классом 'active'
.should('have.length', 2);
Можно использовать функцию для более сложных условий:
cy.get('ul li')
.filter((index, element) => element.textContent.includes('JavaScript'))
.should('exist');.not() Применяется для исключения
элементов из набора по селектору или условию.
cy.get('ul li')
.not('.disabled') // Исключает элементы с классом 'disabled'
.should('have.length.greaterThan', 0);.first() и .last()
Позволяют выбрать первый или последний элемент из набора.
cy.get('ul li')
.first()
.should('contain.text', 'Главная');
cy.get('ul li')
.last()
.should('contain.text', 'Контакты');.eq(index) Выбор конкретного
элемента по индексу в наборе. Индексация начинается с 0.
cy.get('ul li')
.eq(2) // Третий элемент списка
.should('have.class', 'highlight');Для фильтрации элементов по тексту используется метод
.contains() в комбинации с .get().
cy.get('ul li')
.contains('Продукты')
.should('have.class', 'menu-item');
Метод .contains() также можно использовать без
.get() для поиска текста на всей странице:
cy.contains('Войти')
.click();
Методы .filter() и .contains() могут
комбинироваться для создания более точных условий:
cy.get('ul li')
.filter(':visible')
.contains('Новости')
.should('be.visible');
Cypress позволяет фильтровать элементы по их состоянию: видимость, наличие атрибутов, активность.
:visible и :hidden
cy.get('div.modal')
.filter(':visible')
.should('exist');:checked и
:disabled
cy.get('input[type="checkbox"]')
.filter(':checked')
.should('have.length', 3);
cy.get('button')
.not(':disabled')
.click();Использование .should() для проверки
состояния Можно комбинировать фильтры с проверками:
cy.get('input')
.filter(':enabled')
.should('have.attr', 'placeholder', 'Введите имя');Cypress позволяет создавать цепочки фильтров для точного выбора элементов:
cy.get('ul li')
.filter(':visible') // Видимые элементы
.not('.disabled') // Исключение заблокированных
.eq(1) // Второй элемент в наборе
.should('contain.text', 'Сервисы');
Цепочка методов делает тест более читаемым и снижает вероятность ошибок при работе с динамическими DOM-структурами.
Использовать селекторы, специфичные для тестов (например,
data-cy, data-test) для стабильной фильтрации,
так как классы и id могут изменяться.
cy.get('[data-cy=menu-item]')
.filter(':visible')
.should('exist');Избегать выбора элементов по тексту в случае локализации интерфейса, чтобы тесты не ломались при изменении языка.
Комбинировать фильтры и проверки состояния для тестирования динамических элементов, таких как модальные окна, выпадающие списки и табы.
Cypress позволяет фильтровать массивы объектов, возвращаемые с
сервера или получаемые из DOM, с помощью .then().
cy.get('ul li')
.then(($items) => {
const filtered = $items.toArray().filter(item => item.textContent.includes('API'));
expect(filtered.length).to.be.greaterThan(0);
});
Такой подход необходим, когда стандартные CSS-фильтры не подходят для сложной логики.
Фильтрация элементов в Cypress — это мощный инструмент, который
делает тесты точными, стабильными и устойчивыми к изменениям интерфейса.
Использование цепочек методов .filter(),
.not(), .eq(), .first() и
.last(), а также фильтрация по содержимому и состоянию,
обеспечивает гибкость при работе с динамическими веб-приложениями.