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

Написать XPath локатор

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

Условие

Дан HTML код:

<div id="container">
  <form class="login-form">
    <input type="text" name="username" placeholder="Enter username">
    <input type="password" name="password">
    <button type="submit" class="btn primary">Login</button>
  </form>
</div>

Напишите XPath локаторы для:

  1. Поля ввода username
  2. Кнопки Login
  3. Формы авторизации

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

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

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

Решение

Анализ задачи

XPath - это мощный язык для выбора элементов в XML/HTML документах. Для QA инженера это фундаментальный навык при автоматизации тестирования.

XPath для поля username

Простой XPath:

//input[@name='username']

Объяснение:

  • // - поиск по всему документу (от любого уровня)
  • input - тег элемента
  • [@name='username'] - фильтр по атрибуту name

Альтернативные варианты:

//input[@type='text'][@name='username']
//input[@placeholder='Enter username']
//form[@class='login-form']//input[@name='username']
//div[@id='container']//input[@name='username']

Самый безопасный (если структура может меняться):

//form[@class='login-form']//input[@name='username']

Причина: привязывает поиск к форме, делает локатор более стабильным.

XPath для кнопки Login

Простой XPath:

//button[text()='Login']

Объяснение:

  • button - тег элемента
  • [text()='Login'] - фильтр по содержимому текста

Альтернативные варианты:

//button[@type='submit'][@class='btn primary']
//button[@type='submit'][contains(@class, 'primary')]
//button[contains(text(), 'Login')]
//form//button[@type='submit']

Более гибкий вариант (если текст может быть "LOGIN", "login"):

//button[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'login')]

Лучший практический выбор:

//button[@class='btn primary'][@type='submit']

XPath для формы авторизации

Простой XPath:

//form[@class='login-form']

Альтернативные варианты:

//div[@id='container']//form
//form[contains(@class, 'login-form')]
//form[.//input[@name='username']]
//form[.//input[@type='password']]

Самый специфичный:

//div[@id='container']/form[@class='login-form']

Типы XPath локаторов

ТипСинтаксисПримерПреимущества
Абсолютный/html/body/div/formПолный путьТочный, но хрупкий
Относительный//form[@class='login-form']От любого уровняГибкий, универсальный
По ID//*[@id='container']Уникальный IDСамый быстрый
По класу//button[@class='btn']Стиль классаСтабильный
По тексту//button[text()='Login']СодержимоеПонятный для людей
По множеству//input[@type='text' and @name='username']Несколько условийОчень точный

Лучшие практики для QA Automation

  1. Используйте ID когда возможно - самый быстрый и надёжный способ
//*[@id='container']
  1. Используйте относительные пути - более стабильны при изменениях HTML
//form[@class='login-form']//input[@name='username']
  1. Избегайте абсолютных путей - ломаются при добавлении элементов
// Плохо
/html/body/div/form/input

// Хорошо
//form//input[@name='username']
  1. Комбинируйте разные селекторы - делает локатор более специфичным
//form[@class='login-form']//input[@type='text'][@name='username']
  1. Используйте starts-with() для динамических ID
//div[starts-with(@id, 'form')]
//button[starts-with(@id, 'btn_')]
  1. Используйте contains() для частичного совпадения
//button[contains(@class, 'btn')]
//input[contains(@placeholder, 'Enter')]

Итоговые рекомендуемые XPath

Для username:

//form[@class='login-form']//input[@name='username']

Для кнопки Login:

//form[@class='login-form']//button[@type='submit']

Для формы:

//form[@class='login-form']

Преимущества каждого подхода

  • Привязка к форме - если есть несколько форм на странице
  • Привязка к типу - type='submit' для кнопки отправки
  • Привязка к имени - name='username' уникально идентифицирует поле

Тестирование локаторов

В DevTools браузера:

  1. Откройте Console
  2. Используйте $x() для проверки XPath
// Проверить XPath
$x("//form[@class='login-form']//input[@name='username']")

// Результат должен быть массив с одним элементом

Частые ошибки

ОшибкаПримерИсправление
Нет экранирования кавычек//button[@text="it's"]//button[text()='it\'s']
Пробелы в классе//div[@class='btn primary']//div[contains(@class, 'btn')]
Неправильный оператор//input[name='user']//input[@name='user']
Абсолютный путь/html/body/div/form//form