Базовый синтаксис XPath для парсинга элементов: | |||
| 1 | * | Выбрать любой элемент. | |
| 2 | [] | Найти конкретный элемент. | Пример: //li[1] |
| 3 | имя_узла | Выбирает все узлы с указанным именем узла. | Пример: div, p и т.д. |
| 4 | / | Ищет от корневого узла html | |
| 5 | // | Ищет узлы в документе от текущего узла, который соответствует выбору, независимо от того, где они находятся | |
| 6 | . | Ищет текущий узел | |
| 7 | .. | Ищет родителя текущего узла | |
| 8 | @ | Ищет нужный атрибут. | Пример: //p[@value="2008"] |
Общие функции XPath
Язык XPath имеет набор встроенных функций, которые позволяют осуществлять различные операции с XML-документами. Вот некоторые из основных функций XPath:
| 1 | text() | возвращает текстовое содержимое элемента. |
| 2 | count() | возвращает количество элементов, соответствующих указанному выражению. |
| 3 | удаляет лишние пробелы из строки и заменяет последовательности пробелов на одиночные пробелы. | |
| 4 | starts-with(x,y) | проверяет, начинается ли строка с x-y. |
| 5 | contains(x,y) | проверяет, содержит ли строка x-y. |
| 6 | last() | возвращает последнюю позицию элемента в выборке. |
| 7 | @attribute | выбирает значение указанного атрибута. |
| Не работает в web-селекторах | ||
| 8 | position() | возвращает позицию текущего элемента в выборке. |
| 9 | name() | возвращает имя текущего элемента. |
| 10 | sum() | суммирует значения элементов выборки. |
| 11 | string() | преобразует узел в строку. |
| 12 | upper-case() | преобразует текст в верхний регистр. |
| 13 | lower-case() | преобразует текст в нижний регистр. |
| 14 | concat() | объединяет две или более строки. |
| 15 | string-length() | возвращает длину строки. |
| 16 | substring() | возвращает подстроку из строки, начиная с указанной позиции. |
Кроме этих основных функций, XPath также предоставляет более сложные функции, такие как функции математических операций (например, floor(), round(), sum()), функции работы с датами и временем и другие.
//input[@type='submit']
//tbody/tr[contains(@id,'anchor')]
//tbody/tr[contains(@id,'anchor')][1] первый в списке
//tbody/tr[contains(@id,'anchor')][last()] последний в списке
//span[contains(text(),"Главн")]
//span[starts-with(text(),"Главн")]
//span[contains(text(),"Главн") and @class="color"]
//span[contains(text(),"Главн")][@class="color"]
//span[contains(text(),"Главн")]["color"] ПЛОХАЯ ПРАКТИКА
//span[contains(text(),"Главн")][@class="color"]/.. подняться по DOM на уровень выше
//input[@type='search'][starts-with(@id,'input-')] несколько параметров
//div[contains(@class, "error-msg")] если указано несколько значений
через пробел, а ищем по одному из них
//div/div[2]/div[2]/text()[1]
//*[normalize-space(text())='Компоненты']
//span[contains(.,'ABZ')]/following-sibling::span[1] брат следующий за тобой
//ul/li[contains(text(),’Apple Mobiles’)]/following-sibling::li после :: локатор брата
./../preceding-sibling::div/span брат предыдущий перед тобой
//div[contains(text(),'Превышен дневной лимит') or contains(text(),'Превышен')]
.//*[contains(@class,'tooltip-title') or contains(@class,'tooltip-default')]
//*[normalize-space(text())='Подписать']//ancestor::button
//*[normalize-space(text())='Подписать']//parent::button
.//*[@id='someid']//h6[. = 'text1text2'] Что делать, если \n внутри текста на элементе
# Ищем input, после которого идёт текст "checkbox 1"
cb = page.locator("//input[@type='checkbox'][following-sibling::text()[contains(., 'checkbox 1')]]")
Следующие 2 строчки определяют одно и то же:
//button//*[text()='Продолжить']//parent::button
//button[.//*[text()='Продолжить']]" т.е. внутри button ищется элемент со строкой,
но локатор остаётся на уровне button
Не XPath, но полезно
ui-datepicker-popup.open .datepicker-cell:not(.off) :not() - за исключением класса 'off'
ui-datepicker-popup.open .datepicker-cell:not(.off, .bad)
- :not() - за исключением класса 'off' и класса 'bad'
ui-datepicker-popup.open .datepicker-cell:not(:disabled)
- :not() - за исключением псевдо-класса 'disabled'
(может отображаться внутри тега как атрибут без значения)
- Справочник по функциям XPath 1.0 на русском языке
- CSS и XPath для QA: чтобы разобраться с локаторами, нужно всего лишь… [+]
- ХPath: что нужно делать, а что нет [+]
- XPath — быстрый гайд [+]
- XPath — примеры запросов в html для парсинга сайта [+]
- How to use siblings and other functions in XPath [+]
- How to create XPath with following-sibling or preceding-sibling [+]
- XPath text() expression - what to specify in text() if it contains newline [+]