← Назад к вопросам

Какие локаторы чаще всего используешь?

1.8 Middle🔥 291 комментариев
#Selenium и UI автоматизация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Часто используемые локаторы в автоматизации тестирования

В QA Automation выбор локаторов — это фундамент надежного и устойчивого тестового фреймворка. Основной принцип: использовать стабильные, уникальные и производительные локаторы. Вот типы локаторов, которые я применяю чаще всего, в порядке предпочтительности:

1. ID (идентификатор)

Локатор по id — самый надежный и быстрый, поскольку он должен быть уникальным на странице (по стандарту HTML).

<input id="username-input" type="text">
# Пример использования в Selenium WebDriver
driver.find_element(By.ID, "username-input")

Почему часто: Если разработчики присваивают элементам стабильные id, это идеальный вариант. Однако в современных фреймворках (React, Vue) id могут генерироваться динамически, что снижает их полезность.

2. CSS Selectors

CSS селекторы — это мой основной инструмент для сложных случаев. Они чрезвычайно гибкие и быстрые.

# Поиск элемента по классу
driver.find_element(By.CSS_SELECTOR, ".btn-primary")
# Поиск по комбинации класса и типа
driver.find_element(By.CSS_SELECTOR, "input.form-control")
# Поиск по атрибуту
driver.find_element(By.CSS_SELECTOR, "[data-testid='submit-button']")

Преимущества: Высокая скорость, поддержка сложных условий (например, :nth-child, состояния), меньше зависимость от структуры DOM по сравнению с XPath.

3. XPath

XPath — мощный, но потенциально медленный и сложный для чтения. Используется, когда нет других уникальных атрибутов.

# Абсолютный XPath (не рекомендуется из-за хрупкости)
driver.find_element(By.XPATH, "/html/body/div[1]/form/input")
# Относительный XPath с атрибутом
driver.find_element(By.XPATH, "//input[@name='email']")
# Комбинации условий
driver.find_element(By.XPATH, "//div[@class='container']//button[text()='Save']")

Когда использую: Для поиска по тексту (text()), при сложных иерархиях, или когда нужна абсолютная точность. Однако стараюсь избегать чрезмерно длинных и зависимых от структуры XPath.

4. Name, Class Name, Tag Name

Эти локаторы просты, но часто недостаточно уникальны.

driver.find_element(By.NAME, "search")  # Атрибут 'name'
driver.find_element(By.CLASS_NAME, "active")  # Атрибут 'class' (только одно имя класса)
driver.find_element(By.TAG_NAME, "a")  # Тег элемента

Использование: В простых случаях, когда элемент имеет уникальный атрибут name, или для коллекций однотипных элементов (например, все ссылки).

5. Link Text и Partial Link Text

Специфичные для гиперссылок (<a>).

driver.find_element(By.LINK_TEXT, "Перейти в раздел помощи")
driver.find_element(By.PARTIAL_LINK_TEXT, "раздел помощи")

Применение: Только для текстовых ссылок. Удобно, но ограничено.

6. Data-* атрибуты (например, data-testid)

Это лучшая практика для тестирования. Специальные атрибуты, добавленные разработчиками исключительно для автотестов.

<button data-testid="login-submit-button">Войти</button>
driver.find_element(By.CSS_SELECTOR, "[data-testid='login-submit-button']")
# или через XPath
driver.find_element(By.XPATH, "//button[@data-testid='login-submit-button']")

Ключевое преимущество: Они стабильны, поскольку не зависят от стилей или логики приложения, и их изменение контролируется командой.

Стратегия выбора локаторов

Мой подход включает следующие правила:

  • Приоритет стабильности: Использую data-testid или id, если они стабильны и согласованы с разработчиками.
  • CSS над XPath: Для сложных селекторов предпочитаю CSS из-за производительности и читаемости.
  • Избегаю хрупких локаторов: Не использую абсолютные XPath или селекторы, сильно зависимые от структуры DOM (например, div > div > span:nth-child(3)).
  • Читаемость и поддержка: Локаторы должны быть понятны другим членам команды. Часто выношу их в отдельные константы или Page Objects.
# Пример организации в Page Object Model (POM)
class LoginPage:
    USERNAME_INPUT = (By.ID, "username-input")
    SUBMIT_BUTTON = (By.CSS_SELECTOR, "[data-testid='submit-button']")
    
    def enter_username(self, username):
        self.driver.find_element(*self.USERNAME_INPUT).send_keys(username)

Итог: Наиболее часто в моей практике используются CSS Selectors и ID, дополняемые data- атрибутами* при сотрудничестве с разработчиками. XPath применяется как "инструмент последнего выбора" для особо сложных случаев. Основная цель — создать тесты, которые не разорятся при малейшем изменении интерфейса.