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

Для чего использовал селекторы?

2.0 Middle🔥 221 комментариев
#Selenium и UI автоматизация#Фреймворки тестирования

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

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

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

Роль и назначение селекторов в автоматизации тестирования

В контексте автоматизации тестирования веб-приложений с использованием Selenium WebDriver, Playwright или Cypress, селекторы — это фундаментальный механизм для идентификации и взаимодействия с элементами на странице. Я использовал их как адреса или координаты, позволяющие автотесту точно находить нужные UI-элементы (кнопки, поля ввода, таблицы, ссылки) в DOM (Document Object Model) для выполнения действий (клик, ввод текста, проверка атрибутов) и валидации состояния приложения.

Ключевые цели использования селекторов

  • Локализация элементов: Без точного селектора автоматизированный скрипт не сможет найти элемент на странице. Это основа любого сценария — от простого логина до сложной многошаговой бизнес-процедуры.
  • Взаимодействие с интерфейсом: После локации элемент можно использовать для эмуляции действий пользователя.
  • Верификация состояния приложения: Проверка текста, наличия/отсутствия, CSS-свойств, что является сутью тестирования.

Основные типы селекторов, которые я применял

В порядке убывания предпочтения (от наиболее надежных к наименее):

  1. ID: Уникальный идентификатор — самый быстрый и стабильный вариант.

    # Selenium with Python
    driver.find_element(By.ID, "submit-button").click()
    
  2. CSS Selectors: Мощный и гибкий инструмент. Использовал для сложных случаев (дочерние элементы, атрибуты).

    # Найти кнопку внутри div с определенным data-атрибутом
    driver.find_element(By.CSS_SELECTOR, "div[data-widget='cart'] > button.checkout")
    
  3. XPath: Максимальная гибкость для навигации по DOM. Применял, когда другие селекторы не работали (например, для поиска по тексту или сложной иерархии).

    # Найти строку таблицы, содержащую определенный текст
    driver.find_element(By.XPATH, "//tr[td[contains(text(), 'Заказ №12345')]]")
    
  4. Name, Class Name, Tag Name, Link Text: Использовал в простых случаях, когда элементы имеют четкие и неизменные атрибуты.

Стратегия работы с селекторами и обеспечение их устойчивости

Чтобы автотесты были стабильными и легко поддерживаемыми, я следовал нескольким принципам:

  • Приоритет уникальных и стабильных атрибутов: id, data-testid, name — предпочтительнее изменчивых class (часто связанных со стилями) или сложных индексов в XPath (div[3]/span[5]).
  • Использование data-* атрибутов: Договоренность с разработчиками о добавлении специальных атрибутов (например, data-qa="login-email-input") — идеальная практика. Это делает селекторы явными и защищенными от изменений в верстке.
  • Избегание хрупких селекторов: Не использовал селекторы, зависимые от структуры DOM (слишком длинные XPath/CSS), визуального представления или динамически генерируемых значений (классы типа element_aj83d).
  • Создание Page Object Model (POM): Все селекторы выносил в отдельные классы (Page Objects), что централизовало их хранение. При изменении вёрстки правка требовалась только в одном месте.
    // Page Object пример на Java
    public class LoginPage {
        private By usernameField = By.id("username");
        private By passwordField = By.cssSelector("input[type='password']");
        private By submitButton = By.xpath("//button[@type='submit']");
    
        public void login(String user, String pass) {
            driver.findElement(usernameField).sendKeys(user);
            driver.findElement(passwordField).sendKeys(pass);
            driver.findElement(submitButton).click();
        }
    }
    
  • Ожидания (Explicit Waits): Всегда сочетал селекторы с явными ожиданиями (WebDriverWait), чтобы дать странице время на загрузку динамического контента перед поиском элемента.
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    wait = WebDriverWait(driver, 10)
    element = wait.until(EC.presence_of_element_located((By.ID, "dynamic-widget")))
    

Итог: Селекторы — это не просто техническая необходимость, а критически важный аспект проектирования устойчивых автотестов. Грамотный выбор и управление селекторами напрямую влияет на стабильность тестовой пачки, скорость отладки и стоимость поддержки тестового кода в долгосрочной перспективе. Моя практика всегда направлена на поиск баланса между простотой, производительностью и устойчивостью локаторов.