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

Какие знаешь типы локаторов в Selenium?

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

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

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

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

Типы локаторов в Selenium WebDriver

В Selenium WebDriver локаторы — это механизмы для поиска и идентификации элементов на веб-странице. Их правильный выбор напрямую влияет на стабильность и поддерживаемость автотестов. В рамках Selenium WebDriver (через его API) и стандартов W3C WebDriver определены следующие основные типы локаторов, которые я активно использую в практике автоматизации.

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

  1. By.id — поиск по атрибуту id.
    *   Самый предпочтительный и надежный способ, так как `id` должен быть уникальным в рамках страницы (согласно спецификации HTML).
    *   Пример кода (Java):
    ```java
    WebElement searchBox = driver.findElement(By.id("search-input"));
    ```

2. By.name — поиск по атрибуту name.

    *   Часто используется для полей форм (input, textarea, select).
    *   Пример кода (Python):
    ```python
    submit_button = driver.find_element(By.NAME, "submit")
    ```

3. By.className — поиск по атрибуту class.

    *   Важно помнить, что элемент может иметь несколько классов, и в локаторе нужно указывать только один. Для составного класса (например, `"btn btn-primary"`) нужно выбирать одну из частей или использовать CSS Selector.
    *   Пример кода (C#):
    ```csharp
    IWebElement alert = driver.FindElement(By.ClassName("alert-success"));
    ```

4. By.tagName — поиск по имени тега HTML (например, div, a, input).

    *   Чаще всего используется для поиска групп однотипных элементов.
    *   Пример кода (Java):
    ```java
    List<WebElement> links = driver.findElements(By.tagName("a"));
    ```

5. By.linkText — поиск гиперссылки (<a> тег) по полному, точному совпадению видимого текста.

    *   Пример кода (Python):
    ```python
    login_link = driver.find_element(By.LINK_TEXT, "Войти в личный кабинет")
    ```

6. By.partialLinkText — поиск гиперссылки по частичному совпадению видимого текста.

    *   Полезен, когда текст длинный или динамически меняется.
    *   Пример кода (Java):
    ```java
    WebElement link = driver.findElement(By.partialLinkText("кабинет"));
    ```

7. By.xpath — язык запросов для навигации по структуре XML/HTML-документа.

    *   **Наиболее мощный и гибкий** тип локатора. Позволяет находить элементы по любому атрибуту, их комбинации, положению в дереве (родитель, потомок, sibling), текстовому содержимому.
    *   Может быть как абсолютным (начинается с `/`), что очень хрупко, так и относительным (начинается с `.//`), что является правильной практикой.
    *   Примеры (C#):
    ```csharp
    // Поиск по атрибуту и тексту
    IWebElement item = driver.FindElement(By.XPath(".//button[@data-testid='submit' and text()='Save']"));
    // Поиск по сложной иерархии
    IWebElement cell = driver.FindElement(By.XPath(".//tr[td[contains(text(),'Order-123')]]/td[@class='price']"));
    ```

8. By.cssSelector — поиск с использованием синтаксиса CSS-селекторов.

    *   Альтернатива XPath, часто более **производительная** в некоторых браузерах. Более лаконичный синтаксис для типовых задач.
    *   Позволяет искать по `id` (`#`), `class` (`.`), атрибутам, иерархии и псевдоклассам.
    *   Примеры (JavaScript с WebDriverIO):
    ```javascript
    // Поиск по id и дочернему классу
    const button = $('#form').$('.btn-primary');
    // Поиск по нескольким атрибутам
    const input = $('input[type="email"][required]');
    ```

Критерии выбора локатора: мой приоритет на практике

Я следую стратегии "от наиболее надежного к наименее надежному", чтобы минимизировать хрупкость тестов:

  1. Идеальный вариант: data-testid или похожий атрибут через By.xpath или By.cssSelector. В современных проектах договариваемся с разработчиками о добавлении уникальных атрибутов (например, data-qa, data-testid) исключительно для целей тестирования. Это делает локаторы независимыми от изменений верстки или CSS-классов.

    By.cssSelector("[data-testid='login-button']")
    By.xpath("//*[@data-qa='product-name']")
    
  2. By.id — отлично, если атрибут id статичен и уникален.

  3. By.name — для полей форм.

  4. By.cssSelector или относительный By.xpath — для сложных случаев. Я предпочитаю cssSelector для простых выборок по классам и атрибутам из-за читаемости, а XPath — когда нужна навигация по дереву (ось parent::, following-sibling::) или поиск по тексту (функция text() или contains(text())).

  5. By.className, By.tagName — как последний рубеж, обычно внутри другого, более конкретного элемента (WebElement.findElement(...)), чтобы сузить область поиска.

  6. By.linkText / By.partialLinkText — только для текстовых ссылок. Осторожно с интернационализацией (разные языки) и динамическим текстом.

Ключевое правило: Я всегда избегаю использования:

  • Абсолютных XPath (начинающихся с /html/...) — они ломаются от малейшего изменения структуры.
  • Чрезмерно сложных и громоздких локаторов, которые невозможно прочитать.
  • Локаторов, зависящих от стилей (например, :nth-child() без жесткой привязки к структуре данных), если только это не единственный вариант.

Настоятельно рекомендую использовать Page Object Pattern, где все локаторы вынесены в константы или методы, что централизует их управление и упрощает поддержку при изменении верстки приложения.

Какие знаешь типы локаторов в Selenium? | PrepBro