Что такое XPath и для чего он используется в автоматизации тестирования?

Ответ

XPath (XML Path Language) — это язык запросов для навигации по узлам XML- или HTML-документа. В автоматизации тестирования (например, с Selenium) он применяется для поиска элементов в DOM веб-страницы.

Основные виды выражений:

  • Абсолютный путь: Начинается с корня (/). Хрупкий.
    /html/body/div[1]/form/input
  • Относительный путь: Начинается с //. Ищет элемент в любом месте документа.
    //input[@id='username']

Полезные функции и операторы:

//button[contains(@class, 'btn-primary')]  // Кнопка, чей класс содержит подстроку
//a[text()='Log Out']                     // Ссылка с точным текстом
//div[starts-with(@id, 'user_')]          // Div, чей ID начинается с 'user_'
//input[@type='submit' and @disabled]     // Комбинация условий
//ul/li[last()]                           // Последний элемент в списке
Сравнение с CSS-селекторами: Критерий XPath CSS-селектор
Поиск по тексту Да (text()). Нет.
Навигация вверх Да (родитель ..). Нет.
Производительность Может быть медленнее. Обычно быстрее.
Читаемость Может быть сложным. Чаще проще.

Рекомендация: Используйте XPath, когда нужна сложная логика поиска (например, по тексту или сложным отношениям элементов). Для простых случаев предпочтительнее стабильные CSS-селекторы или поиск по ID и data-атрибутам (например, data-testid).

Ответ 18+ 🔞

А, XPath, ёпта! Ну это ж как язык для того, чтобы шастать по этим вашим XML и HTML, как по джунглям, блядь. Представь, что у тебя документ — это такой огромный деревянный чурбан, а ты с этим XPath'ом как топором, ищешь, где тут у тебя кнопка спряталась, чтобы её нажать. В автоматизации, особенно с этим Selenium'ом, без него — нихуя.

Смотри, есть два главных способа, как ты можешь искать, как последний идиот или как умный человек.

Первый способ — Абсолютный путь. Это когда ты начинаешь с самого корня, с /. Это как если бы ты говорил: «Иди от парадного подъезда, поднимись на третий этаж, в квартиру номер пять, в прихожей на вешалке в правом кармане пальто лежит ключ». Один хрен кто-то переставит вешалку — и всё, пиздец, ключ не найдешь. Хрупкий, блядь, до ужаса.

/html/body/div[1]/form/input

Второй способ — Относительный путь. Вот это уже умнее, начинается с //. Это как крикнуть на всю квартиру: «Эй, ключ от балкона, ты где, сука?» И он отзовется, где бы ни был. Гораздо надежнее.

//input[@id='username']

А ещё там есть такие фишки, просто волшебство, блядь! Смотри, какие козыри в рукаве:

//button[contains(@class, 'btn-primary')]  // Найдет кнопку, даже если у неё в классе кроме 'btn-primary' ещё и 'btn-large' прилеплено. Умная жопа!
//a[text()='Log Out']                     // Ищет ссылку по ТОЧНОМУ тексту. Не «Выйти», не «Разлогиниться», а именно «Log Out». Педантично, блядь.
//div[starts-with(@id, 'user_')]          // Найдет все дивы, чей ID начинается на 'user_'. 'user_profile', 'user_avatar' — всех загребает!
//input[@type='submit' and @disabled]     // Вот это сила! И «submit» И «disabled» одновременно. Нашел заблокированную кнопку отправки — сиди, не рыпайся.
//ul/li[last()]                           // Берёт последний пункт списка. Прям как в жизни — всегда берут того, кто в конце стоит.

А теперь, блядь, главный вопрос: XPath или CSS-селекторы? Вечная драка, как «Зенит» и «Спартак».

Критерий XPath CSS-селектор
Поиск по тексту Да, легко! (text()). Нет, нихуя.
Навигация вверх Да, к родителю через .. вернешься. Нет, только вниз скачешь.
Скорость Иногда тормозит, как старый Запорожец. Обычно шустрее.
Читаемость Может превратиться в такую хуйню, что мама не горюй. Чаще выглядит попроще и почище.

Так что в итоге, ёбана? Если тебе нужно что-то хитрое — найти элемент по тексту, который внутри лежит, или пролезть по сложным родственным связям (типа «найди див, который является братом тёти этого спана») — твой выбор XPath, ёпта. А если всё просто — кнопка с уникальным id или с каким-нибудь специальным data-testid (это вообще святое!), то не выёбывайся, используй CSS. Быстрее и надёжнее будет, в рот меня чих-пых!