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

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

2.0 Middle🔥 162 комментариев
#Теория тестирования#Фреймворки тестирования

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

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

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

Локаторы в Python (Selenium WebDriver)

В контексте автоматизации тестирования веб-приложений с использованием Selenium WebDriver в Python, локаторы — это стратегии поиска элементов на веб-странице. Правильный выбор локатора напрямую влияет на стабильность и поддерживаемость автотестов. Вот основные типы локаторов, доступные через метод find_element(By.*, "value").

Основные типы локаторов

  1. По ID (By.ID)
    *   Самый предпочтительный и надежный локатор, так как `id` должен быть уникальным в пределах страницы.
    *   Пример:
    ```python
    from selenium.webdriver.common.by import By
    driver.find_element(By.ID, "login-button")
    ```

2. По имени (By.NAME)

    *   Ищет элемент по атрибуту `name`. Часто используется для полей форм.
    *   Пример:
    ```python
    driver.find_element(By.NAME, "username")
    ```

3. По классу (By.CLASS_NAME)

    *   Находит элемент по значению атрибута `class`. Важно помнить, что у элемента может быть несколько классов.
    *   Пример:
    ```python
    driver.find_element(By.CLASS_NAME, "btn-primary")
    ```

4. По тегу (By.TAG_NAME)

    *   Ищет элементы по имени HTML-тега (например, `div`, `a`, `input`). Часто возвращает несколько элементов.
    *   Пример:
    ```python
    driver.find_elements(By.TAG_NAME, "a")  # Все ссылки на странице
    ```

5. По тексту ссылки (By.LINK_TEXT)

    *   Точное совпадение видимого текста гиперссылки (`<a>` тег). Чувствителен к регистру и пробелам.
    *   Пример:
    ```python
    driver.find_element(By.LINK_TEXT, "Перейти в корзину")
    ```

6. По частичному тексту ссылки (By.PARTIAL_LINK_TEXT)

    *   Поиск по части видимого текста гиперссылки. Удобен, если текст динамический.
    *   Пример:
    ```python
    driver.find_element(By.PARTIAL_LINK_TEXT, "корзину")
    ```

7. CSS-селектор (By.CSS_SELECTOR)

    *   Мощный и гибкий локатор, использует синтаксис CSS-селекторов. Позволяет создавать сложные запросы (например, `#container > .item:nth-child(2)`).
    *   Примеры:
    ```python
    # По id
    driver.find_element(By.CSS_SELECTOR, "#submit")
    # По классу
    driver.find_element(By.CSS_SELECTOR, ".alert.error")
    # По комбинации атрибутов
    driver.find_element(By.CSS_SELECTOR, "input[name='email'][type='text']")
    ```

8. XPath (By.XPATH)

    *   Самый мощный и универсальный язык запросов к структуре XML/HTML документов. Позволяет искать элементы по любому атрибуту, тексту, позиции в дереве.
    *   Примеры:
    ```python
    # Абсолютный путь (хрупкий, не рекомендуется)
    driver.find_element(By.XPATH, "/html/body/div[1]/form/input")
    # Относительный путь с атрибутом
    driver.find_element(By.XPATH, "//input[@id='search']")
    # По тексту
    driver.find_element(By.XPATH, "//button[text()='Войти']")
    # По частичному совпадению атрибута
    driver.find_element(By.XPATH, "//div[contains(@class, 'loaded')]")
    # Поиск по нескольким условиям
    driver.find_element(By.XPATH, "//a[@href='/cart' and @data-qa='checkout']")
    ```

Критерии выбора и best practices

При выборе локатора я придерживаюсь следующего приоритета, который формирует стратегия устойчивого локатора:

  • ID > Name > Class — если атрибуты статичны и уникальны.
  • CSS Selector — для сложных, но стабильных комбинаций. Часто работает быстрее XPath в старых браузерах.
  • XPath — когда нужна максимальная гибкость: поиск по тексту, навигация по DOM (родитель, потомок), использование функций (contains(), starts-with()).
  • Следует избегать хрупких локаторов, зависящих от:
    *   Абсолютных XPath-путей.
    *   Позиции элемента в DOM (например, `:nth-child(3)` без уникального контекста).
    *   Динамических атрибутов (например, `id="button-123456"`, где цифры меняются).

Работа с несколькими элементами

Для получения списка всех подходящих элементов используется метод find_elements (во множественном числе). Это полезно для проверок количества элементов или взаимодействия с коллекциями.

# Получить все элементы с классом 'product-item'
all_products = driver.find_elements(By.CLASS_NAME, "product-item")
print(f"Найдено товаров: {len(all_products)}")
for product in all_products:
    print(product.text)

Важность явных ожиданий (Explicit Waits)

Любой локатор должен использоваться в сочетании с явными ожиданиями (WebDriverWait и expected_conditions). Это решает проблемы с асинхронной загрузкой страницы и делает тесты стабильными.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Ожидание появления элемента перед кликом
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, "dynamic-button")))
element.click()

Вывод: Грамотный подбор локатора — это баланс между уникальностью, стабильностью и производительностью. На практике в проектах часто используются комбинации: стабильные id для ключевых элементов, data-qa атрибуты, согласованные с фронтенд-разработчиками, и XPath/CSS для сложных сценариев навигации. Всегда предпочтительнее договориться о тестовых атрибутах (например, data-testid), которые создаются специально для автоматизации и не меняются при рефакторинге вёрстки.