🛑 Данный туториал отображается на GitHub 🔴 не корректно! Это лишь исходник.
Правильная версия https://www.epic1h.com/best_selectors

Туториал: находим лучшие селекторы для UI элементов

Подойдет тем, кто хочет писать устойчивые, понятные и короткие селекторы в авто-тестах.

👍 Что сделаем

💪 Минутка мотивации

Задача End-To-End тестов — заставить компьютер нажимать на кнопки, вводить данные в поля формы, двигать мышкой — как это делал бы человек.

Селекторы / локаторы — позволяют находить элементы UI с которыми ты будешь заставлять машину взаимодействовать.

Селекторы — основная часть будущего исходного кода твоих тестов.

От того, насколько хорошо ты будешь находить селекторы элементов, твой код будет:

🤮 Твой код до:

cy.get('body main div[class="panel"] form .input-primary').type('?');
cy.get('body .form #xxyyzz').type('?');
cy.get('[class="btn btn-primary"]').click();

🤩 Твой код после:

cy.get('form.login input[name=email]').type('?');
cy.get('form.login input[name=password]').type('?');
cy.get('form.login button[type=submit]').click();

🙋‍ Перед началом

Если забыл, глянь в наш первый туториал

🫵 Наставления

Помни: никто тебя ничему не научит, если ты сам этого не захочешь!

Просто бывает только в рекламе! Ну ты понял в какой.


🔢 Шаги

+1. Подготовка Веб-сервера

Тебе нужно разместить тестовое веб-приложение на локальном веб-сервере.

  "scripts": {
+   "start": "tiny-server",
  }
Не получается 📹

npm start — это зашитая команда в NPM

Можно запускать команду не только npm run start, а короче npm start

📹 Мое объяснение


+2. Загрузка тестового приложения

Веб-сервер готов, нужно скачать тестовое приложение с GitHub.

npx wget -d apps/ https://open-tutorials.github.io/cypress/apps/tesla.html

~ — так обозначается путь до корневой папки проекта.

Не получается 📹
Как скачать Google 🤟
  • Выполни в терминале npx wget -d google.html https://google.com/
  • ❓ В корне проекта должен появится файл google.html, что там?

📹 Мое объяснение


+3. Запускаем тест приложения

Нужно открыть тестовое приложение в Cypress.

it('should do register user', () => {

    cy.visit('http://localhost:3000/apps/tesla.html');

});
Не получается 📹

📹 Мое объяснение


+4. Ищем селекторы

Нужно ввести в поле фамилия тестовые данные.

it('should do register user', () => {

    cy.visit('http://localhost:3000/apps/tesla.html');
    cy.get('#b1h7e4i8d3').type('Иванов');

});
Не получается 📹

📹 Мое объяснение


Селектор поля меняется 🥴 динамически при каждом запуске приложения.

❗ Следует использовать устойчивые к изменениям селекторы!

🙅 Анти-паттерн

Использовать хрупкие селекторы, которые могут быть изменены.

Пример — хеш элемента который может поменяться после новой сборки приложения:

<button id="zIyPEZ0bf">Продолжить</button>

👍 Лучшая практика

Добавить специальные data- атрибуты к элементам в HTML разметку.

<button data-cy="register">Продолжить</button>

В твоем тесте ты напишешь:

cy.get('button[data-cy=register]').click();

❗ Тестируй только то, что можешь контролировать! ~"В конспект"

🙅 Анти-паттерн

Пытаться тестировать сайт или приложение, которое ты не контролируешь.

👍 Лучшая практика

Работать совместно с разработчиками сайта или приложения.

Если ты не контролируешь приложение, то можешь столкнуться с проблемами:


+5. Поиск лучшего селектора

❓ Это хорошие селекторы?

- [ ] Отличные 
- [x] Плохие


Это плохие селекторы, встроенный selector playground в Cypress не справляется — в топку 🤮

Инструменты разработчика

Всегда ищи селекторы через Инструменты разработчика в Chrome

В окне тестового приложения:


С помощью тэгов HTML и стилей CSS рендерится пользовательский интерфейс.

Лучший селектор:

  1. Не изменяемый — устойчивый к обновлениям приложения.
  2. Понятный — можно прочитать на естественном языке:
// first name input field on registration form
cy.get('form.registration input[name=first_name]')
  1. Короткий — задействует как можно меньше элементов и их атрибутов в иерархии.

📹 Мое объяснение


+6. Тест формы регистрации

Нужно написать позитивный тест-кейс зарегистрироваться с шагами:

  1. Заполнить поле Имя
  2. Заполнить поле Фамилию
  3. Заполнить поле Email
  4. Заполнить поле Пароль
  5. Нажать кнопку Продолжить

Нужно найти уникальный семантический (со смыслом) атрибут или класс.

В нашем случае для поля Имя это input[name=first_name]


Не получается 📹

cy.get('input[name=last_name]').type('Иванов');
cy.get('input[name=first_name]').type('Иван');

$('input[name=email]') — cелектор для поля Email не уникален!

На странице 2 формы Регистрация и Вход и на каждой из них есть поле Email.

Контекст для элемента

Контекст для элемента: форма, группа, раздел — некоторая уникальная область интерфейса.

Как найти контекст

Примеры хороших 👍 контекстов:

Примеры плохих 🙅 контекстов:

🔥 Необходимо добавлять контекст к селекторам элементов!

Примеры хороших 👍 селекторов с контекстами:

Примеры плохих 🙅 селекторов с контекстами:


+7. Тест формы входа


+8. Селектор по contains

Элементы в Cypress можно находить еше по текстовому содержимому тегов.

cy.visit('http://localhost:3000/apps/tesla.html?lang=en');

📹 Мое объяснение


Мини-тест. Это хороший селектор?

cy.get('input[placeholder=Имя]').type('?');
- [ ] Да, конечно
- [x] Нет, нет, нет


Неееет! Это тоже самое, что и с `contents` 

**При смене языка, тест перестанет работать!**

<iframe src="https://giphy.com/embed/wYyTHMm50f4Dm" 
  width="480" height="277" frameBorder="0" class="giphy-embed" allowFullScreen></iframe>

❗ Используй селекторы устойчивые к изменениям конфигурации приложения.


+9. TODO для разработчиков

❗ Что делать, если нельзя найти хороший селектор:

  1. Использовать лучший из худших.
  2. Поставить задачу разработчикам на добавление атрибута data-cy

Текущая разметка:

<body>
<div>
    <footer>
        <p>Все права защищены</p>
    </footer>
</div>
<body>

В твоем тесте:

it('should do check copyrights', () => {

    // TODO: should be p[data-cy=copyrights]
    // we can use contains
    cy.contains('Все права защищены').should('be.visible');
    // or exact hierarchy
    cy.get('body > div > footer p').should('have.text', 'Все права защищены.');

});
<body>
<div>
    <footer>
        <p data-cy="copyrights">Все права защищены</p>
    </footer>
</div>
<body>
cy.get('footer p[data-cy=copyrights]').should('have.text', 'Все права защищены.');

Названия аттрибутов для целей тестирования могут быть разными:

data-for-test, data-ui-id, data-test-id и т.д.


Та да 🥳 Ты дошел до конца.

👨‍🎓 Чему ты научился


😭 Домашка

Найди лучшие селекторы для формы регистрации и заполни ниже:

  1. поле имя пользователя —
  2. поле email —
  3. поле пароль —
  4. кнопка регистрации —

📹 Мой разбор

🙏 Фидбек пожалуйста

Полезный материал?

* 🤩 Очень полезный материал
* 😃 В целом полезный
* 😐 Возможно что-то пригодится
* 😒 Нет ничего полезного
* 😬 Абсолютно бесполезно


**Спасибо за ответ!**

Все ли было понятно?

* 🤩 Все понятно на 100%
* 😃 В целом все понятно
* 😐 Что-то понятно, что-то нет
* 😒 Понял только малую часть
* 😬 Ничего не понял


**Спасибо за ответ!**

Как тебе такой формат туториала?

* 🤩 Очень удобно
* 😃 Мне понравилось
* 😐 Нормально
* 😒 Не удобно
* 😬 Ужасно


**Спасибо за ответ!**

📹 Видео-ответы

  1. Зачем тестировщику доступ к исходному коду проекта?
  2. Какие еще навыки должны быть у тестировщика?
  3. Почему при обучении важно вести собственные конспекты?
  4. Почему можно тестировать только то, чем можно управлять?
  5. Как скачать Google?
  6. Какими должны быть селекторы в авто-тестах?
  7. Что делает функция $ в инструментах разработчика?
  8. Какой основной алгоритм для поиска селекторов?
  9. Что такое ага-эффект?
  10. Какие атрибуты добавлять к элементам для улучшения селекторов?
  11. Что такое CSS селектор по атрибуту?
  12. Как комбинировать CSS селекторы?
  13. Какие самые распространенные CSS селекторы?
  14. Как красиво оформлять сообщения в Telegram?
  15. Как правильно оформлять вопросы в Telegram?
  16. Что такое Markdown и зачем он в ИТ?

Артефакты