Ответ
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. Быстрее и надёжнее будет, в рот меня чих-пых!