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

Что используешь для поиска локаторов: XPath или CSS?

1.8 Middle🔥 161 комментариев
#Теория тестирования

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

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

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

Мой подход к выбору локаторов в автоматизации тестирования

Как опытный QA Automation инженер, я придерживаюсь стратегического подхода к выбору локаторов, основанного на конкретном контексте, требованиях проекта и оптимальном балансе между надежностью, производительностью и читаемостью кода. Мой выбор между XPath и CSS селекторами не является догматичным — я использую оба инструмента, но в разных ситуациях.

Ключевые критерии выбора

Преимущества и случаи применения CSS селекторов

CSS селекторы я предпочитаю в большинстве стандартных ситуаций благодаря их:

  • Более высокой производительности (особенно в современных браузерах)
  • Простому и лаконичному синтаксису для базовых случаев
  • Лучшей читаемости для большинства разработчиков и тестировщиков
  • Нативной поддержке в браузерах
/* Примеры CSS селекторов */
#login-button          /* По ID */
.submit-btn           /* По классу */
div.container > form  /* Дочерний селектор */
input[type='email']   /* По атрибуту */
button:disabled       /* Псевдокласс */

Ситуации, где XPath незаменим

XPath становится моим инструментом выбора, когда требуется:

  • Навигация по DOM в обоих направлениях (к родителям, предкам, siblings)
  • Поиск по тексту элемента (чего CSS не поддерживает)
  • Сложные условия с операторами and/or
  • Работа с XML документами (не только HTML)
  • Динамические структуры, где нужно искать элементы относительно других
// Примеры XPath выражений
//button[text()='Submit']                          /* По тексту */
//div[@id='container']//input[contains(@class,'field')]  /* Вложенный поиск */
//*[contains(@class,'error') and not(@hidden)]     /* Комбинированные условия */
//label[text()='Email']/following-sibling::input   /* Навигация по оси */

Моя практическая стратегия

В своей работе я следую приоритетной цепочке выбора локаторов:

  1. Нативный ID (если есть) — всегда самый надежный вариант
  2. CSS селекторы для большинства стандартных случаев
  3. XPath для сложных сценариев, где CSS недостаточно
  4. Комбинированные подходы в Page Object моделях

Пример реализации в Page Object

class LoginPage:
    # CSS селекторы для простых случаев
    USERNAME_FIELD = "input#username"
    PASSWORD_FIELD = "input[type='password']"
    SUBMIT_BUTTON = "button.submit-btn"
    
    # XPath для сложных случаев
    ERROR_MESSAGE = "//div[contains(@class,'error') and contains(text(),'Invalid')]"
    DYNAMIC_ITEM = "//ul/li[contains(text(),'{0}')]"
    
    def __init__(self, driver):
        self.driver = driver
    
    def login(self, username, password):
        # Использование CSS селекторов
        self.driver.find_element(By.CSS_SELECTOR, self.USERNAME_FIELD).send_keys(username)
        self.driver.find_element(By.CSS_SELECTOR, self.PASSWORD_FIELD).send_keys(password)
        self.driver.find_element(By.CSS_SELECTOR, self.SUBMIT_BUTTON).click()
        
        # Проверка через XPath при необходимости
        try:
            error = self.driver.find_element(By.XPATH, self.ERROR_MESSAGE)
            return f"Login failed: {error.text}"
        except:
            return "Login successful"

Важные рекомендации по созданию устойчивых локаторов

  • Избегайте абсолютных XPath (/html/body/div[1]/div[2]/...) — они хрупкие и ломаются при любых изменениях вёрстки
  • Минимизируйте зависимость от индексов (div[3], //li[2])
  • Используйте data-атрибуты при возможности — разработчики могут добавлять data-testid специально для автотестов
  • Комбинируйте атрибуты для уникальности: input.username[type='text']
  • Реализуйте явные ожидания (Expected Conditions) перед поиском элементов

Производительность и поддержка

Хотя в прошлом разница в производительности между XPath и CSS была значительной, в современных браузерах и фреймворках (особенно с использованием WebDriver W3C стандартов) эта разница стала минимальной для большинства сценариев. Важнее создавать оптимальные выражения вне зависимости от типа селектора:

# Неоптимальный XPath
"//div[@id='content']//div//div//span//a"

# Оптимальная альтернатива
"#content a.link-item"  # CSS
"//div[@id='content']//a[@class='link-item']"  # XPath

Заключение

Мой подход можно сформулировать как «CSS-first, XPath-when-needed». Я начинаю с CSS селекторов для их простоты и производительности, но без колебаний использую XPath для сложных сценариев, где требуется его уникальная функциональность. Ключевой принцип — выбирать инструмент, который делает тесты наиболее устойчивыми к изменениям и понятными для всей команды, а не придерживаться какой-то одной технологии по религиозным соображениям. В конечном счете, качество автоматизации определяется не типом селектора, а умением инженера выбрать правильный инструмент для конкретной задачи.