CSS-селекторы являются основным способом поиска элементов на странице в тестах Cypress. Они позволяют точно идентифицировать элементы и взаимодействовать с ними, выполняя клики, ввод текста, проверку видимости и другие действия. Cypress полностью поддерживает стандартные CSS-селекторы, а также предоставляет собственные команды для удобной работы с DOM.
В Cypress поиск элементов выполняется через команду
.get(). В качестве аргумента передается строка
CSS-селектора:
cy.get('button') // выбирает все элементы <button>
cy.get('.btn-primary') // выбирает все элементы с классом btn-primary
cy.get('#login') // выбирает элемент с id="login"
Важно помнить, что .get() возвращает коллекцию
элементов. Если на странице несколько совпадений, можно уточнить выбор с
помощью .first(), .last() или
.eq(index):
cy.get('.list-item').eq(2) // выбирает третий элемент с классом list-item
Cypress поддерживает комбинации CSS-селекторов, что позволяет точнее идентифицировать элементы:
cy.get('form#login input[type="text"]') // текстовое поле внутри формы с id="login"
cy.get('.menu li.active a') // ссылка внутри активного элемента списка
Использование комбинированных селекторов сокращает вероятность ложных совпадений и делает тесты более устойчивыми к изменениям DOM.
Атрибутные селекторы особенно полезны, когда элементы не имеют уникальных id или классов. Cypress поддерживает все стандартные варианты CSS:
cy.get('[placeholder="Email"]') // элемент с атрибутом placeholder="Email"
cy.get('[type="checkbox"][name="agree"]') // элемент с type="checkbox" и name="agree"
cy.get('[data-test-id="submit-btn"]') // часто используют data-* атрибуты для тестирования
Особое внимание стоит уделять data-*
атрибутам. Они позволяют изолировать тесты от изменений
внешнего вида и классов, которые могут меняться без влияния на
функциональность.
Cypress корректно работает с псевдоклассами CSS, что позволяет выбирать элементы по состоянию или позиции:
cy.get('ul li:first-child') // первый элемент списка
cy.get('ul li:last-child') // последний элемент списка
cy.get('ul li:nth-child(2)') // второй элемент списка
cy.get('input:checked') // выбранные чекбоксы или радио-кнопки
Использование псевдоклассов делает тесты более выразительными и уменьшает количество лишних селекторов в коде.
Для работы с элементами внутри контейнеров удобно использовать
цепочку .find(). Она позволяет ограничить область поиска
конкретным родительским элементом:
cy.get('.modal').find('button.close') // кнопка закрытия внутри модального окна
cy.get('form#signup').find('input[name="email"]') // поле email внутри формы регистрации
Отличие .find() от .get() заключается в
том, что поиск выполняется только внутри найденного ранее элемента, а не
по всему документу.
Cypress предоставляет методы .filter(),
.not() и .contains() для дополнительной
фильтрации найденных элементов:
cy.get('ul li').filter('.active') // активные элементы списка
cy.get('ul li').not('.disabled') // исключаем элементы с классом disabled
cy.contains('button', 'Отправить') // кнопка с конкретным текстом
.contains() особенно полезен для работы с динамическим
контентом, где классы и id могут изменяться, а текст остается
стабильным.
В тестировании крайне важно создавать селекторы, которые будут стабильны при изменении интерфейса. Лучшие практики включают:
data-* атрибутов специально для
тестов.nth-child, сложные цепочки классов) без
необходимости.Пример устойчивого селектора:
cy.get('[data-test-id="login-button"]').click()
Даже если класс кнопки изменится, тест останется рабочим, так как селектор привязан к логическому назначению элемента.
После нахождения элемента через CSS-селектор можно выполнять стандартные действия Cypress:
cy.get('input[name="username"]').type('admin')
cy.get('input[name="password"]').type('12345')
cy.get('button[type="submit"]').click()
cy.get('.notification').should('contain', 'Успешный вход')
Сочетание точных селекторов и проверок состояния обеспечивает надежность автоматизированных тестов.
.get() — основной метод для поиска элементов по
селекторам.data-* селекторы повышают стабильность
тестов..find()
позволяют уточнять выбор..filter(), .not(),
.contains() помогают точно определить нужный элемент.Эффективное использование CSS-селекторов в Cypress обеспечивает точное взаимодействие с элементами страницы и повышает надежность автоматизированного тестирования.