Перевод статьи «Autocompleting selectors in Cypress with TypeScript».
Содержание:
- Использование селекторов data-* с пользовательскими командами
- Создание файла селектора
- Проверка селекторов
- Поиск неиспользуемых селекторов data-cy
В этой статье вы узнаете:
- как создать собственную команду, которая будет автоматически заполнять ваши селекторы;
- как выполнять проверку тестов, написанных на TypeScript;
- как искать селекторы в приложении;
- как создать предупреждение о том, что в вашем приложении есть селекторы, которые вы не используете.
Cypress рекомендует использовать селекторы data-cy в качестве лучшей практики для выбора элементов на странице. Часто мнения о том, является ли это хорошей практикой, разделяются. Лично я решительно склоняюсь к «да». Если вы тоже относитесь к этому лагерю, то сегодня у меня есть для вас несколько полезных советов.
Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ
Использование селекторов data-* с пользовательскими командами
Если вы часто используете селекторы data-*, то, скорее всего, вы хотите создать пользовательскую команду.
Cypress.Commands.add('getDataCy', (input) => {
return cy.get(`[data-cy='${input}']`);
})
Таким образом, вы можете пропустить запись части [data-cy=''] при использовании команды .get(). Если вы хотите создать более сложную версию этой команды, вы можете изучить полезную статью на эту тему, в которой рассказывается о том, как можно улучшить логи для вашей пользовательской команды.
При использовании TypeScript можно дополнительно определить, какой тип входных данных будет получать наша вновь созданная пользовательская функция. Обычно мы можем выбрать что-то простое, например input: string. Но мы также можем создать собственный тип, который ограничит тип входных данных, передаваемых нашей функции.
type Selectors = 'board' | 'list' | 'card'
Cypress.Commands.add('getDataCy', (input: Selectors) => {
return cy.get(`[data-cy='${input}']`);
})
Таким образом, TypeScript будет выдавать ошибку, если мы используем недопустимый селектор:

Создание файла селектора
Со временем список селекторов может стать довольно большим. Поэтому, вероятно, было бы неплохо хранить его в отдельном файле. Мой подход заключается в создании файла selectors.d.ts, в котором хранится список всех моих селекторов. Обычно я сохраняю его в папке cypress/support/@types/.
type Selectors = | 'board' | 'list' | 'card' // ...
Каждый раз, когда я добавляю новый селектор в свое приложение, мне необходимо добавить его в список, иначе я получу ошибку. С другой стороны, когда я использую селектор, который уже есть в списке, в VS Code появляется красивое автозаполнение.

Проверка селекторов
Конечно, может возникнуть ситуация, когда мы удалим селектор из списка и не заметим этого до тех пор, пока не откроем тестовый файл или не запустим наши тесты. Поскольку мы используем TypeScript, мы можем создать скрипт typecheck, который будет проверять наличие ошибок. Этот скрипт будет использовать флаг --noEmit, потому что нам не нужно компилировать наши файлы. Это сделает Cypress при запуске наших тестов.
// ...
"scripts": {
"typecheck": "tsc --noEmit -p ."
}
// ...
Еще одна вещь, которую мы можем сделать, — это получить наши селекторы из исходного кода. Это, конечно, немного сложно, поскольку не все приложения и фреймворки работают одинаково. В моем проекте приложения Trello есть скрипт, который выводит селекторы из моих файлов .vue в папке src.
#!/usr/bin/env bash SRC_SELECTORS=$(grep -hro 'data-cy="[^"]*"' src | cut -d \" -f2 | sort | uniq)
Затем я использую этот очень неудобный способ генерации всех селекторов в файле cypress/support/@types/selectors.d.ts. Но пока что он работает.
#!/usr/bin/env bash SRC_SELECTORS=$(grep -hro 'data-cy="[^"]*"' src | cut -d \" -f2 | sort | uniq) echo $SRC_SELECTORS | sed "s/ /'\n| '/g; s/^/&export type Selectors = \n| '/; s/.$/&'/;" | cat > cypress/support/@types/selectors.d.ts
Таким образом, если какой-либо из моих селекторов из исходного кода будет удален, я сразу же замечу это при запуске скрипта npm run typecheck.
Поиск неиспользуемых селекторов data-cy
В примере ниже я решил вывести в grep и свои тесты. Затем я сравнивал эти селекторы с теми, что были найдены в исходном коде, и выводил предупреждение, если они были лишними.
#!/usr/bin/env bash # find all selectors in src folder SRC_SELECTORS=$(grep -hro 'data-cy="[^"]*"' src | cut -d \" -f2 | sort | uniq) # find all selectors in cypress folder TEST_SELECTORS=$(grep -hro '.getDataCy([^"]*' cypress | cut -d \' -f2 | sort | uniq) # compare selector lists UNUSED_SELECTORS=$(comm -23 <(echo "$SRC_SELECTORS") <(echo "$TEST_SELECTORS")) # if any found in src, print them our if [[ $UNUSED_SELECTORS != "" ]]; then echo -e "WARNING! There are some selectors in your app that are not being used: $UNUSED_SELECTORS" fi # create selectors.d.ts from all selectors found in src echo $SRC_SELECTORS | sed "s/ /'\n| '/g; s/^/&export type Selectors = \n| '/; s/.$/&'/;" | cat > cypress/support/@types/selectors.d.ts fi
Я предполагаю, что есть какие-то более эффективные способы решения этой задачи. Данный скрипт есть в свободном доступе в моем проекте приложения Trello.

Пингбэк: Работа с xpath-селекторами в Cypress
Пингбэк: Большой учебник по Cypress