Что такое селекторы в автоматизации тестирования UI?

Ответ

Селекторы в UI-автоматизации (например, в Selenium, Cypress, Playwright) — это локаторы, которые позволяют инструменту автоматизации однозначно находить и взаимодействовать с элементами на веб-странице (кнопки, поля ввода, div-блоки).

Основные типы селекторов: Тип Пример (Selenium WebDriver) Плюсы / Минусы
By.ID driver.find_element(By.ID, "submit-btn") Самый быстрый и надежный, если ID уникален.
By.CSS_SELECTOR driver.find_element(By.CSS_SELECTOR, ".primary.button") Быстрый, гибкий синтаксис, знакомый фронтенд-разработчикам.
By.XPATH driver.find_element(By.XPATH, "//button[@type='submit']") Максимальная гибкость (поиск по тексту, вверх/вниз по DOM), но может быть медленным и хрупким.
By.NAME driver.find_element(By.NAME, "username") Хорош для полей форм.
By.CLASS_NAME driver.find_element(By.CLASS_NAME, "alert") Просто, но классы часто не уникальны.

Лучшие практики выбора селекторов:

  1. Приоритет: ID > data-* атрибуты > CSS Selector > XPath.
  2. Стабильность: Используйте уникальные, статические атрибуты. Избегайте селекторов, зависящих от порядка элементов (например, div:nth-child(3)) или текста, который может быть переведен.
  3. Читаемость: Делайте селекторы понятными. Для сложных элементов можно использовать data-testid.
    
    # Хороший пример: использование data-атрибута для тестирования
    login_button = driver.find_element(By.CSS_SELECTOR, "[data-testid='login-submit']")

Плохой пример: хрупкий XPath, зависящий от структуры

login_button = driver.find_element(By.XPATH, "/html/body/div[2]/div[3]/button[1]")


**Важно:** Для динамических элементов всегда используйте **явные ожидания (Explicit Waits)**.

Ответ 18+ 🔞

А, ну вот, подъехали к самому соку, к этим вашим селекторам! Это ж, блядь, как в криминальном розыске: чтобы найти нужного пидораса на странице, нужна его точная примета, а не «ну, такой, в красной кепке». Вот эти селекторы — они и есть приметы для нашего автоматизатора-сыщика.

Смотри, какие у нас главные подозреваемые есть:

ID — это, блядь, король и бог. Как паспорт с фотографией. Уникальный, быстрый, сразу в лоб. Нашёл driver.find_element(By.ID, "submit-btn") — и всё, пиздец, элемент твой. Но проблема в том, что фронтендеры иногда ленятся эти паспорта раздавать, и тогда начинается веселье.

CSS-селектор — наш рабочий конь. Гибкий, как гимнастка, знакомый любому, кто хоть раз вёрстку трогал. .primary.button — и вот тебе кнопка. Быстро, элегантно, но если классов навешали как говна за баней, можно и ошибиться.

XPath — это, ёпта, тяжёлая артиллерия. Может всё: найти по тексту, ползать вверх-вниз по дереву DOM, как таракан по плинтусу. //button[@type='submit'] — мощно. Но! Он же и самый медленный, и самый хрупкий. Стоит дизайнеру чихнуть и переставить блок — и твой красивый XPath, блядь, накрылся медным тазом. Это как искать иголку в стоге сена с помощью экскаватора — найдёшь, но стог разворотишь.

NAME и CLASS_NAME — ну, это уже для простых задач. Как NAME для полей ввода — норм. А CLASS_NAME... Ну, классы они как мартышки в зоопарке — их дохуя и все похожие. Ненадёжные они, блядь.


Так как же не облажаться, а?

Правила простые, как три копейки:

  1. Иерархия важности: Сначала ищи ID. Нету? Ищи data-testid или другие data-* атрибуты — их специально для тестов пихают. Потом CSS. И только в самом крайнем случае, когда всё хуёво, лезь в XPath.
  2. Держись за стабильное! Цепляйся за атрибуты, которые не меняются каждую пятницу. Избегай, блядь, селекторов вроде div:nth-child(3) — сегодня третий, а завтра он уже пятый, потому что маркетологи впихнули ещё два баннера. И текст — это вообще минное поле, если сайт мультиязычный.
  3. Читаемость — наше всё. Селектор должен быть понятным не только тебе в три часа ночи, но и коллеге, который будет это читать через полгода.

Смотри, вот наглядная разница между адекватом и тем, кто уже на ладан дышит:

# Нормальный, адекватный подход. data-testid — это наш друг.
login_button = driver.find_element(By.CSS_SELECTOR, "[data-testid='login-submit']")

# А это, блядь, что? Это путь в никуда. Абсолютный XPath, который сломается от чиха.
login_button = driver.find_element(By.XPATH, "/html/body/div[2]/div[3]/button[1]")

И главное, запомни раз и навсегда, как «Отче наш»: если элемент динамический, появляется не сразу — не надо, блядь, тупо ждать секунду! Используй явные ожидания (Explicit Waits). Иначе твои тесты будут падать чаще, чем пьяный голубь с крыши.