Селекторы являются основой автоматизированного тестирования в Cypress, так как именно через них происходит взаимодействие с элементами страницы. Правильный выбор и использование селекторов напрямую влияет на стабильность, читаемость и поддержку тестов.
Наиболее надёжный способ обращения к элементу — использование
уникальных атрибутов, таких как id или специально созданные
для тестов data-* атрибуты:
<button id="submit-login">Войти</button>
<button data-cy="submit-login">Войти</button>
В Cypress:
cy.get('#submit-login').click();
cy.get('[data-cy=submit-login]').click();
Ключевые моменты:
id уникален на странице, что делает селектор
точным.data-* атрибуты создаются специально для тестов и не
зависят от визуального представления или структуры DOM.Селекторы по классам и сложной структуре DOM выглядят удобно, но часто оказываются хрупкими:
cy.get('.form > .input-group > input').type('test'); // ненадежно
Проблемы:
Рекомендация: использовать классы только как
fallback, если нет уникальных идентификаторов или data-*
атрибутов.
Селектор должен ясно отражать назначение элемента. Например, вместо:
cy.get('[data-cy=btn-1]').click();
лучше использовать:
cy.get('[data-cy=submit-login]').click();
Это облегчает понимание теста без необходимости открывать HTML.
cy.contains для текстовых элементовДля кнопок и ссылок, текст которых уникален и не меняется, удобно
использовать cy.contains:
cy.contains('Войти').click();
cy.contains('Забыли пароль?').should('be.visible');
Особенности:
В случаях, когда уникальных атрибутов недостаточно, можно комбинировать селекторы:
cy.get('[data-cy=form-login] input[name=email]').type('test@example.com');
Плюсы:
Минусы:
Cypress позволяет тестировать элементы независимо от стилей. Это означает, что:
btn-primary,
text-center), лучше не применять как основной
селектор.Пример плохой практики:
cy.get('.btn-primary').click(); // сломается при смене темы
Пример правильной практики:
cy.get('[data-cy=submit-login]').click();
Если элемент используется несколько раз в тесте, можно назначить алиас:
cy.get('[data-cy=submit-login]').as('submitButton');
cy.get('@submitButton').click();
cy.get('@submitButton').should('be.disabled');
Преимущества:
Перед взаимодействием с элементом рекомендуется проверять его состояние:
cy.get('[data-cy=submit-login]').should('exist').and('be.visible').click();
Это гарантирует, что тест не упадет из-за отсутствия элемента на странице в момент выполнения действия.
Чтобы тесты были устойчивыми к изменениям интерфейса:
data-* атрибуты для
критичных элементов.Пример использования Page Object для селекторов:
// loginPage.js
export const loginPage = {
emailInput: '[data-cy=email]',
passwordInput: '[data-cy=password]',
submitButton: '[data-cy=submit-login]',
};
// тест
import { loginPage } from './loginPage';
cy.get(loginPage.emailInput).type('user@example.com');
cy.get(loginPage.passwordInput).type('password');
cy.get(loginPage.submitButton).click();
Это делает тесты более структурированными, упрощает обновление селекторов и улучшает читаемость.
Эти практики обеспечивают стабильность тестов, их поддержку и понимание при командной разработке. Селекторы должны быть предсказуемыми, устойчивыми к изменениям интерфейса и удобными для чтения.