В этом небольшом вводном руководстве разберемся с XPath, а также с его наиболее распространенными типами, операторами, узлами и функциями.
XPath или XML Path Language — язык запросов, используемый для навигации по XML-документу. XML — язык разметки, чем-то похожий на HTML, не выполняющий никаких действий, а просто служащий для описания и структурированного хранения каких-нибудь данных. Проще говоря — это куски информации, завернутые в теги, для получения которой разработчик пишет специальную программу. Чтобы такая программа нашла необходимые элементы, нужно проложить к ним путь. Этот путь называют XPath-выражение.
XPath применяется для перехода к любому необходимому нам тегу, атрибуту или текстовому блоку и используется в связке с такими технологиями, как XSLT, XQuery, XLink и XPointer. XPath можно использовать в индустрии разработки ПО — почти все языки программирования поддерживают его, — а также при тестировании программного обеспечения, в частности для разработки сценариев автоматизации в Selenium. Кроме всего прочего, он является рекомендуемым языком консорциума World Wide Web (W3C), поэтому с ним стоит разобраться. Сделать это лучше всего с практикующими специалистами, например, с преподавателями из школы наших партнеров Mate Academy.
Под узлами понимают вложенные теги, атрибуты и тексты, составляющие содержимое корневого элемента. От каждого вложенного тега могут отходить свои ветви. Элементы в дереве узлов имеют иерархические взаимоотношения друг с другом. Пример таких взаимоотношений показан на изображении ниже.
Существуют разные типы узлов XPath. Но прежде, чем их перечислить, напишем базовую программу XML, чтобы на ее примере объяснить все используемые здесь термины.
<SoftwareTestersList> <softwareTester name="T1"> <State>Kiew</State> <country>UA</country> </softwareTester> <softwareTester name="T2"> <State>Odessa</State> <country>UA</country> </softwareTester> </SoftwareTestersList>
SoftwareTestersList
». Для его выбора используется косая черта ‘/
‘.Software Tester
, State
, Country
.name
» — это атрибутный узел тегов softwareTester. Для обозначения применяется значок «@
».Kiew
», «UA
», «Odessa
».<!... >
..
).Оси определяют отношение узлового набора по отношению к текущему узлу. Рассмотрим самые основные из них и поймем, как они могут работать, в нашем примере:
XPath self :: *
или .
child :: software tester
...
). Например: parent :: State
и ../State
.@
). Например: attribute :: name или @name.
Мы с вами разобрали, что XPath ищет элементы на HTML или XML-страницах.
Для того чтобы добраться к искомому объекту, используются пути. Они являются наиболее полезным и широко используемым свойством XPath. Путь состоит из набора узлов XPath относительно его стартового (чаще всего корневого) элемента.
Есть два вида путей: абсолютный и относительный.
Абсолютным называется путь от корня документа. Он всегда начинается с косой черты “/
”.
Корень документа всегда является узлом по умолчанию, то есть текущим полученным узлом или набором узлов, относительно которых рассчитывается следующий шаг.
Например:
<html> <head> <body> <div class=”mainWrap”> <h1> Основной заголовок</h1> <p>абзац текста</p> <div>Блок1</div> <ul> <li>пункт1</li> <li>пункт2</li> </ul> </div> <div class=”sideBar”> <div> <div>пустой блок</div> <div> <div> <table border=”1”> </body> </html>
Из примера выше мы видим, что для того, чтобы добраться до тега (<li>
пункт 1</li>
), нам нужно, начиная с корня документа (<html>
), посетить каждый дочерний элемент родителя.
В XPath это будет выглядеть так:
/html/body/div/ul/li[1]
Пример из жизни: есть семиэтажное здание. Чтобы попасть на седьмой этаж по лестнице, нам нужно последовательно посетить все этажи с первого по седьмой — /1/2/3/4/5/6/7
. Это будет абсолютный путь.
Относительным называют путь от одного элемента (не обязательно от корневого) к другому. Чаще всего в таких случаях XPath-запрос начинают с «.//
» или «//
».
Символы «//
», проставленные в начале запроса, возвращают полное множество потомков, являющихся дочерними для корня документа, то есть все элементы на текущей странице.
Например:
Чтобы добраться до тега (<li>
пункт 1</li>
), мы опустим все теги, находящиеся выше тега (<div>
), и заменим их на «//
». Также можем заменить всех предков тега (<li>
) на «//
», исключая тег (<div>
).
Вот как это будет выглядеть в XPath:
//div//li[1]
Пример из жизни: есть семиэтажное здание. Нам нужно попасть с третьего на седьмой этаж, не посещая этажи четыре, пять, шесть (где живут наши недоброжелатели). Для этого можно воспользоваться лифтом и пропустить их. Наш путь будет выглядеть следующим образом: //3//7
. А если нам придется подниматься по лестнице, то наш путь будет выглядеть так:
//3/4/5/6/7
Синтаксис языка запросов немного похож на обозначения, используемые в URL-адресах. XPath выражение — это не что иное, как путь к нужному нам элементу в дереве документа, где каждый уровень отделяется от другого косой чертой «/
», а результатом его обработки может быть:
/html/body/div
Если применить к предыдущему участку HTML-кода, он вернет два узла элементов div
, содержащиеся в элементе body
.
/html/body/div or p
вернет значение true
, так как в элементе body
содержится элемент div
.
/html/body/div/h1['Основной заголовок']
Вернет элемент h1
с текстом «Основной заголовок», содержащийся в первом элементе div
.
Ниже перечислены подстановочные знаки, применяемые в XPath-выражениях.
(*)
: выберет все узлы элементов контекстного узла (включая текст, комментарии, инструкции и узел атрибутов).(@ *)
: выберет все узлы атрибутов контекстного узла.Node ()
: это выберет все узлы контекстного узла (включая пространства имен, текст, атрибуты, элементы, комментарии и инструкции).Предикаты в XPath
Предикаты используются как фильтры, ограничивающие узлы, которые выбраны выражением XPath. Каждый предикат преобразуется в логическое значение, истинное или ложное, если оно истинно для данного XPath, то этот узел будет выбран, если ложно, то — нет.
Предикаты всегда заключаются в квадратные скобки, например:
softwareTester [@ name = ”T2 ″]:
Этот пример выберет элемент <softwareTester>
с атрибутом, равным T2.
XPath содержит стандартную библиотеку встроенных функций, необходимых для обработки узлов и работы с данными.
Их довольно много, поэтому перечислим некоторые из них:
1. Функции даты и времени:
current-date()
. Возвращает текущую дату.current-dateTime()
. Возвращает текущую дату и время.hours-from-time(time)
. Извлекает компонент часов из значения времени.dateTime(date, time)
. Объединяет указанную дату и время.days-from-duration(dayTimeDuration)
. Извлекает дневной компонент значения продолжительности дня.timezone-from-dateTime(dateTime)
. Извлекает компонент часового пояса значения даты и времени.2. Функции имен:
base-uri()
. Возвращает значение базового URI контекстного узла.local-name()
. Возвращает локальную часть имени контекстного узла.name(node)
. Возвращает имя узла в виде строки в лексической форме QName
.3. Функции набора узлов:
avg(anyAtomicType_sequence)
. Возвращает среднее значение набора чисел или их продолжительности.count(item_sequence)
. Подсчитывает количество элементов в последовательности.error()
. Вызывает ошибку.id(string_sequence)
. Находит элементы с заданными значениями атрибута ID
.4. Числовые функции:
number(object)
. Возвращает число на основе переданного ему объекта.floor(aNumber)
. Возвращает число, равное аргументу, округленное в меньшую сторону до ближайшего целого числа.abs(numeric)
. Возвращает абсолютное значение заданного числа. Возвращает тот же тип, что и предоставленный аргумент.ceiling(aNumber)
. Возвращает число, равное аргументу, округленное до ближайшего целого числа.5. Строковые функции:
string(object)
. Преобразует объект в строку.compare(comparand1, comparand2)
. Сравнивает две строки с использованием параметров сортировки по умолчанию.lower-case(string)
. Изменяет символы в строке на нижний регистр.string(item)
. Возвращает строковое значение аргумента.Описания всех существующих ныне функций можно найти в спецификации W3 XPath.
Ниже приведем наиболее часто встречающиеся участки кода XPath, применяемые разработчиками для парсинга данных с веб-страниц:
//h1/text()
productName
://h1[@class="productName"]/text()
span
по классу://span[@class="price"]
title
у тега button
с классом addtocart_button
://input[@class="addtocart_button"]/@title
//a/text()
url
-значение атрибута href
необходимой ссылки://a/@href
src
рассматриваемого изображения://img/@src
following
://h1[@class="produnctName"]//following::div/img/@src
div
по счету://div[4]/img/@src
XPath довольно полезная вещь, широко применяемая при автоматизации тестирования. Он действует как локатор элементов. Чтобы найти определенный кусок данных на странице и выполнить над ним какое-либо действие, необходимо просто указать его XPath в целевом столбце сценария инструмента тестирования Selenium.
Для закрепления материала приводим несколько полезных ссылок на релевантные видеоролики по теме:
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…