В веб-тестировании элементы часто
используются для выбора значений из выпадающих списков. Cypress
предоставляет удобные методы для работы с такими элементами, позволяя
эмулировать выбор, проверять выбранные опции и взаимодействовать с
динамическими списками.
selectОсновной метод для взаимодействия с — это
cy.select(). Он позволяет выбрать опцию по значению
(value), тексту
(label) или индексу.
Синтаксис:
cy.get('select#country').select('USA'); // по тексту
cy.get('select#country').select(['USA', 'Canada']); // несколько опций
cy.get('select#country').select('us'); // по значению атрибута value
cy.get('select#country').select(2); // по индексу (нумерация с 0)
Особенности:
имеет атрибут multiple.select() автоматически проверяет, что выбранная опция
действительно существует. Если нет — тест упадет.['Canada', 'us'].После выбора опции важно убедиться, что действие произошло корректно.
Cypress предоставляет команду .should() для проверки
состояния элемента.
Примеры проверки:
cy.get('select#country')
.select('Canada')
.should('have.value', 'ca'); // проверка по value
cy.get('select#country')
.select('Canada')
.find(':selected')
.should('have.text', 'Canada'); // проверка видимого текста
Особенности:
.should('have.value', ...) проверяет значение атрибута
value выбранной опции..find(':selected') позволяет получить текст выбранной
опции.cy.get('select#languages')
.select(['JavaScript', 'Python'])
.invoke('val')
.should('deep.equal', ['js', 'py']);
Некоторые генерируются динамически через
JavaScript после загрузки страницы. В таких случаях важно убедиться, что
элемент полностью отрендерен, прежде чем взаимодействовать с ним.
Пример с ожиданием:
cy.get('select#city', { timeout: 10000 }).should('be.visible');
cy.get('select#city').select('Moscow');
Советы:
{ timeout: ... } для элементов, которые
загружаются асинхронно..children('option'):cy.get('select#city').children('option').should('have.length.greaterThan', 0);
Многие современные UI-библиотеки (например, React Select, Ant Design)
используют кастомные компоненты, которые выглядят как
Подход: Пример для кастомного селекта: Cypress автоматически бросает ошибку, если опция не найдена, но можно
дополнительно контролировать поведение: Преимущества такого подхода:, но на самом деле являются набором
. Для таких
элементов стандартный .select() не работает.
cy.get('.custom-select').click();
cy.get('.custom-select .option').contains('Moscow').click();
cy.get('.custom-select .selected-value').should('have.text', 'Moscow');
Обработка ошибок при выборе
cy.get('select#country').then($select => {
const optionExists = $select.find('option[value="us"]').length > 0;
if (optionExists) {
cy.wrap($select).select('us');
} else {
cy.log('Опция отсутствует');
}
});
Практические рекомендации
id,
data-cy) для ..click() и .contains().:selected или текст в DOM).