Что такое xpath selenium
Введение в XPath (часть 1). Поддержка XPath в Selenium и инструментальные средства
XPath (XML Path Language) — язык запросов к элементам XML или XHTML документа, реализующий навигацию по DOM. XPath предназначен для использования другими спецификациями, такими как XSL Transformations (XSLT) и XML Pointer Language (XPointer).
Будьте внимательны, используя xpath. Selenium при построении xpath-запроса использует стандартные обозначения — поиск начинается с «//», т.е. будет искать по DOM-дереву всего документа, а не только среди потомков текущего узла. Поэтому если вы выстраиваете поисковые запросы в цепочку, то используйте «.//» для того, чтобы ограничить поиск среди потомков элемента.
Некоторые HTML элементы не нуждаются в явном указании атрибутов потому, что они имеют какое-то стандартное значение по умолчанию. Основное правило при использовании xpath — НЕ полагайтесь на то, что XPath-запрос обнаружит такой неявный атрибут.
Для браузеров, в которых встроенная поддержка XPath отсутствует, разработана собственная реализация поиска по xpath. Однако, в некоторых случаях, это может приводить к неожиданным результатам.
Driver | Встроенная поддержка XPath |
HtmlUnitDriver | Yes |
InternetExplorerDriver | No |
FirefoxDriver | Yes |
Скажу пару слов об инструментальных средствах XPath, которые могут пригодиться в ходе работы. Они позволяют отлаживать XPath-выражения и помогают при создании и проверке XPath. Их использование значительно облегчает написание тестов, в которых используется поиск элементов по xpath. Так как поле нашей деятельности — это тестирование сайтов и web-приложений, то и речь пойдет о поддержке XPath в браузерах:
Синтаксис и правила построения xpath-запросов описаны в статье Введение в XPath (часть 2). Основы построения запросов
Полное Руководство По Использованию XPath В Селене С Примерами
Мы рассмотрим этапы поиска элемента по XPath в Selenium с примерами, чтобы помочь вам понять различные способы использования динамического XPath. Помечено csharp, java, тестирование.
Идентификация элемента всегда была самой сложной частью и поэтому требовала точного и правильного подхода. Если вы не можете найти элементы с помощью легко доступных подходов, таких как идентификатор, класс, имя, ссылка или название тега, то XPath в Selenium может помочь вам. Расположение динамических элементов всегда было проблемной областью, в то время как вы хотите автоматизировать сценарии, единственным лучом надежды справиться с такими неудачами является XPath. В моей текущей статье я расскажу о шагах поиска элемента с помощью примера XPath в Selenium и его различных способах. Мы рассмотрим следующие разделы: 1. Что такое XPath в Selenium? 2. Типы XPath в Selenium 2.1 Абсолютный 2.2 Относительный 3. Написание динамического XPath в Selenium различными способами : 3.1 Базовый XPath 3.2 Использование ‘ИЛИ’ & ‘И’ 3.3 Использование Содержит() 3.4 Использование Начинается С 3.5 Использование текста() 3.6 Использование индекса 3.7 Использование цепного пути XPath 3.8 Оси XPath 3.8.1 Следующий 3.8.1.1 Следующий Брат Или Сестра 3.8.2 Предшествующий 3.8.2.1 Предшествующий Брат Или Сестра 3.8.3 Ребенок 3.8.4 Родитель 3.8.5 Потомки 3.8.6 Предки
Если вы хотите изучить другие подходы к поиску элемента, вы можете просмотреть следующие статьи: 1. Как найти элемент по идентификатору 2. Как найти элемент по имени 3. Как найти элемент по имени тега 4. Как найти элемент с помощью CSS-селекторов 5. Различные локаторы в Selenium WebDriver
Итак, Что Такое XPath В Selenium?
XPath, известный как путь XML, – это язык, который помогает запрашивать XML-документы. Он состоит из выражения для пути вместе с определенными условиями для определения местоположения определенного элемента.
Итак, давайте посмотрим, как написать XPath в Selenium. Ниже приведена структура DOM для Страницы регистрации лямбда-теста :
Ссылка на скриншот страницы:
Лямбда-тест – это облако кросс-браузерного тестирования, которое предлагает сетку Selenium из более чем 2000 реальных браузеров и версий браузеров, чтобы помочь вам обеспечить бесперебойную работу пользователя. Нажмите здесь, чтобы начать бесплатно.
Чтобы визуализировать приведенный выше XML-документ, я создал приведенную ниже блок-схему.
Здесь я напишу XPath в Selenium из корневого узла, который в нашем случае является тегом формы, затем найду поле полного имени, используя дочерний элемент div 2 и значение атрибута поля полного имени. Путь XPath, созданный в этом случае, будет выглядеть следующим образом: Ниже приведен фрагмент кода, выделяющий путь XPath, написанный с использованием относительного пути XPath для страницы регистрации LambdaTest.
В этом случае я сослался на один атрибут детей и внуков, чтобы отличать их от множества детей и внуков каждого родителя. Из этого мы можем вывести общий синтаксис XPath следующим образом:
В настоящее время, благодаря использованию множества плагинов и инструментов, можно относительно легко найти XPath в Selenium. Причина, по которой я не призываю людей делать это, заключается в том, что XPath, предоставляемый этими инструментами, иногда оказывается хрупким. Кроме того, это может привести к тому, что люди забудут основные концепции создания локаторов XPath. Используя инструменты разработки firebug и Chrome, можно также скопировать необходимый XPath в Selenium.
Типы XPath В Selenium
Существует два типа XPath
Пример Абсолютного XPath В Selenium
В случае абсолютного XPath в Selenium выражение XPath создается с использованием выделения из корневого узла. Он начинается с одной косой черты “/” и проходит от корня до всего DOM, чтобы добраться до нужного элемента. Самым большим недостатком использования этого в качестве определения местоположения элемента является то, что в ходе разработки какие-либо изменения, внесенные в путь, могут привести к неудачному выражению XPath. Например:
В приведенном выше примере XPath в Selenium, если имя какого-либо тега, например раздела или одного из разделов, изменится, весь XPath станет недействительным, что приведет к сбою скрипта.
Относительный пример XPath В Селене
В случае относительного XPath в Selenium выражение XPath генерируется из середины структуры DOM. Он представлен двойной косой чертой “//”, обозначающей текущий узел. В этом случае поиск начнется с указанного имени тега и строкового значения. Он более компактен, прост в использовании и менее подвержен поломкам. Например:
В приведенном выше примере XPath в Selenium мы выполняем поиск с текущего узла с вводом имени тега, имеющего атрибут в качестве имени со значением в качестве адреса электронной почты.
Ниже приведен фрагмент кода, выделяющий XPath, написанный с использованием относительного XPath для страницы регистрации лямбда-теста.
Написание Сложного И Динамического XPath В Selenium С Помощью Различных Методов
Использование базового XPath
Это общий и синтаксический подход к написанию XPath в Selenium, который представляет собой комбинацию имени тега и значения атрибута. Вот несколько основных примеров XPath в Selenium:
Первые два примера в базовом списке XPath кажутся самоочевидными. В нем мы использовали теги в качестве входных данных и привязки тега с соответствующим значением атрибута. Последние два примера – это просто расширенная версия использования XPath в Selenium. В третьем примере мы просто исключили HTML-тег и представили его звездочкой(*). В этом случае скрипт будет искать в DOM любой HTML-тег, имеющий атрибут ID со значением ’email_01′. В случае примера 4 мы создали XPath, используя несколько атрибутов для одного HTML-тега.
Использование ‘ИЛИ’ & ‘И’
Как уже упоминалось, эти логические выражения используются при условии атрибутов. В случае ИЛИ любое из условий должно быть истинным или оба, тогда как в случае И оба условия должны быть выполнены. Например, для приведенной ниже структуры DOM XPath с использованием И и ИЛИ может быть записан как:
В случае ИЛИ если какое-либо из значений атрибута совпадает, элемент будет найден, тогда как в случае И того, и другого значение атрибута должно совпадать и соответствовать, тогда будет найден только элемент. Описанные выше способы были внедрены в приведенный ниже фрагмент кода, где мы пытаемся ввести значения в Страница регистрации лямбда-теста.
Ниже приведена ошибка консоли, отображаемая как последний элемент, не найденный, поскольку условия не были выполнены.
Пожалуйста, обратите внимание: Оба “и” и “или” должны быть чувствительны к регистру. В случае, если вы склонны использовать “ИЛИ” или “И”, вы получите сообщение об ошибке в консоли с указанием недопустимого выражения xpath
Использование Содержит()
Этот подход к созданию XPath в Selenium удобен, когда у нас есть часть значений атрибутов, которая динамически изменяется. Например, допустим, идентификатор поля входа, например, email_01, имеет конечный номер, который постоянно меняется при каждой загрузке страницы. В этом случае использование contains помогает нам найти элемент с постоянными именами, например, в данном случае “электронная почта”. Примером создания XPath с содержимым для приведенной ниже структуры DOM является:
Здесь, в приведенном выше примере XPath для Selenium, мы использовали такие атрибуты, как заполнитель, имя и т.д., И учитываем частичные значения для идентификации элементов с использованием ключевых слов contains. Приведенный ниже фрагмент кода, в котором подчеркивается использование вышеупомянутого создания XPath, в этом мы нажимаем на кнопку “Начать тестирование” на домашней странице LambdaTest. Упомянутый скриншот:
Использование Начинается С()
Это похоже на описанный выше метод contains, единственное отличие заключается в том, что значение сравнения здесь начинается с начального строкового значения. Это полезно, когда для данного атрибута частично изменяются значения. Как и в приведенном выше примере XPath, значение электронной почты изменяется для последних значений. Здесь можно использовать подход “с нуля” для идентификации элемента. Ниже приведены примеры XPath для Selenium, подчеркните использование starts-with для приведенной ниже структуры DOM:
Здесь, в приведенном выше примере, мы использовали два атрибута с ключевым словом starts-with. Скрипт найдет имя тега и совпадет со значением атрибута, начинающимся с “Организация”. Ссылочный фрагмент кода, в котором подчеркивается использование ключевого слова “Начинается с” при поиске элемента через XPath в Selenium. Мы будем использовать тот же пример, что и выше, с той лишь разницей, что мы найдем элемент с помощью starts-with.
Использование текста()
Это ключевое слово используется для создания выражений для XPath в Selenium, когда у нас есть текст, определенный в теге HTML, и мы хотим идентифицировать элемент с помощью текста. Это очень удобно, когда другие значения атрибутов динамически изменяются без существенной части значения атрибута, которое можно использовать с помощью Starts-with или Contains. Ниже приведен пример XPath в Selenium, в котором подчеркивается использование текста для следующей структуры DOM:
Использование индекса
Этот подход используется, когда вы хотите указать заданное имя тега в терминах значения индекса, которое вы также хотите найти. Например, рассмотрим КУПОЛ, имеющий несколько входных тегов для каждого отдельного значения поля, и вы хотите ввести текст в 4-е поле. В этом случае вы можете использовать индекс для переключения на заданное имя тега. Например:
Для данной структуры DOM я хочу найти второе поле тега ввода:
В приведенном выше примере будет выбран локатор с “Полным именем” в качестве поля. Первый входной тег будет проигнорирован, тогда как другой тег будет учитываться из-за упомянутого индекса. Такой подход удобен при работе с данными в таблицах. Например, если у вас несколько строк, вы можете ссылаться на нужную строку с помощью индекса. Ссылочный фрагмент кода с использованием индекса для табличной формы данных для страницы регистрации лямбда-теста, где через класс формы мы переходим к полю “полное имя” с использованием индекса.
Использование Цепного XPath В Selenium
Здесь мы попытаемся перейти к “Ссылке для входа”. Синтаксис для этого таков.
В приведенном выше примере XPath в Selenium я нашел родительский класс для тегов ссылок, а затем перешел к дочернему классу, используя цепочку для ссылки “вход”. Приведенный выше пример был достигнут с помощью приведенного ниже фрагмента кода.
ЗАПУСКАЙТЕ СВОИ СЦЕНАРИИ SELENIUM В ОБЛАЧНОЙ СЕТКЕ
Более 2000 Браузеров И ОС
Оси XPath
Оси XPath удобны, когда точное имя тега элемента или значение его атрибута являются динамическими и не могут быть использованы для определения местоположения элемента. В этом случае поиск элемента после прохождения через ребенка/родного брата или родителя будет простым подходом. Некоторые из широко используемых осей XPath являются:
Упомянутый скриншот, выделяющий два элемента ввода, в котором мы попытаемся найти элемент поле “Полное имя” через элемент поле “Организация”
В вышеупомянутых примерах первый выберет ввод, следующий за элементом организации, тогда как во втором примере он выберет все элементы, следующие за элементом организации, имеющим входной тег. Это полезно, когда мы намереваемся найти элемент в таблице или когда у нас нет никакого местонахождения следующего элемента из текущего узла. Упомянутый ниже фрагмент кода отображает элементы, расположенные следующим образом. В этом примере мы будем использовать домашнюю страницу теста Lamba, где мы пройдемся по параметрам заголовка меню, используя класс single header. Ссылка на скриншот ниже:
2. Следующий брат и сестра: Это одна из концепций, с которой люди склонны путаться. Все, что вы можете прояснить для себя с помощью этой концепции, – это братья и сестры. В случае следования все узлы под текущим узлом являются целевыми, независимо от того, находятся они под (дочерним) контекстным узлом или нет, но следуют ниже контекстного узла. В случае следующих братьев и сестер применимы все последующие узлы контекстного узла, которые имеют одного и того же родителя. В этом случае все братья и сестры называются дочерними элементами родительского узла. Поэтому, если вы ссылаетесь на одного из детей и хотите перейти к другим детям того же родителя, который следует за ним, следующий брат делает свое дело.
Например, используя ссылки на домашнюю страницу лямбда-теста, в приведенной ниже структуре DOM была сделана ссылка на одного из дочерних элементов, и из нее мы перейдем к его братьям и сестрам.
В этом случае родитель, его дети – разные li, здесь мы найдем ссылку для входа и от них найдем логин, используя следующего родного брата
Ниже приведен фрагмент кода, включающий пример XPath в Selenium.
3. Предшествующий: Этот метод помогает найти элемент перед текущим узлом, как в предыдущем элементе из текущего узла с XPath в Selenium. Ниже приведена демонстрация структуры DOM.
Ссылка на скриншот ниже:
4. Предшествующий Брат или Сестра: Это концепция, аналогичная следующему брату, единственная разница в функциональности заключается в функциональности предыдущего. Таким образом, в этом случае вы можете переключаться между братьями и сестрами, но в этом случае вы переключитесь с узла контекста, который был дочерним, и перейдете к предыдущему узлу, который вы хотите найти. Оба ребенка будут иметь одного и того же родителя. Используя тот же пример, что и в следующем разделе, теперь мы перейдем от ссылки регистрации к ссылке входа, используя предыдущий раздел. Синтаксис для того же самого таков
Примечание: В случае, если вы не укажете индекс родного брата, по которому хотите перемещаться, он может выбрать любой. Для конкретного выбора вам необходимо указать индекс. В случае единственного родственного брата из контекстного узла вам не нужно указывать индекс. Ниже приведен фрагмент кода для того же примера XPath в Selenium.
5. Ребенок: Как указано в названии, этот подход используется, когда мы намереваемся найти все дочерние элементы текущего узла. Основным вариантом использования этого подхода может быть, когда мы хотим просмотреть все данные в таблице по строкам, в этом случае мы можем найти все дочерние элементы определенной таблицы. Например, используя приведенную ниже структуру DOM, мы можем создать XPath в Selenium следующим образом:
Упомянутый скриншот того же самого.
В вышеупомянутом примере в первом будут найдены все поля ввода div, для которых есть поле организации, поле имени, поле электронной почты, поле пароля и поле номера телефона, в то время как другое используется для поиска элемента только с полем организации.
6. Родитель: Этот метод используется для выбора родительского узла текущего узла. Например, для приведенной ниже структуры DOM родительский узел расположен через XPath.
В приведенном выше примере родительский элемент расположен через его дочерний элемент. Из поля электронной почты мы переходим к его родительскому узлу. Пожалуйста, обратите внимание, что в случае дочернего XPath учитываются только непосредственные потомки текущего узла, а не внуки. В случае, если текущий узел является корневым узлом, то его родительский узел будет пустым и, следовательно, у него не будет родительских тузов. Ниже приведен фрагмент кода для того же самого:
7. Потомки: Этот подход используется для определения местоположения элемента через XPath для всех дочерних и дочерних элементов текущего узла. Для приведенной ниже структуры DOM потомки XPath в Selenium расположены следующим образом:
В приведенном выше примере будут выбраны все элементы, такие как поле электронной почты, поле пароля и кнопка. Также можно выбрать одно из указанных полей с помощью индекса. Ниже приведен фрагмент кода, в котором рассказывается об его использовании.
8. Предки: В этом методе контекстный узел, родитель или его бабушка и дедушка выбираются с помощью осей Предков. Например, для приведенной ниже структуры DOM предок будет определен как:
В приведенном выше примере первый будет указывать на родительский узел полей входа, а другой будет указывать на его родительский узел, который в данном случае является формой тега. Приведенный ниже фрагмент кода, подчеркивающий использование того же самого.
Вывод
XPath в Selenium помогает человеку находить решения по размещению элементов, когда стандартные процессы не работают. Когда использовать, что важно, когда речь заходит о различных сложностях структуры DOM и функциональных потребностях. Как было определено ранее в моей статье, кросс-браузерное тестирование может быть одной из областей, где вы можете изучить создание XPath в Selenium из-за различного поведения браузера по отношению к элементу DOM. Убедитесь, что какой бы метод вы ни выбрали в случае XPath, он менее подвержен сбоям и делает сценарии более надежными, аккуратными и простыми в обслуживании. Ваше здоровье!
Статьи по теме
Поиск Элементов С Текстом Ссылки И Частичным Текстом Ссылки В Selenium
Учебное пособие по Selenium Java – Локатор имен классов В Селене
Руководство по поиску элементов с использованием XPath в Selenium Python
При работе с Selenium если элемент на веб-странице не обнаруживаются общеизвестными локаторами locators, использующими значения атрибутов дерева DOM таких как id, class и name, то для его поиска используют либо CSS селекторы, либо локаторы XPath (XML Path).
Важным отличием локаторов, основанных на синктаксисе XPath от CSS селекторов является то, что используя XPath, мы можем при поиске нужного элемента перемещаться как вглубь иерархии дереву документа, так и возвращаться назад (вверх по дереву). Что касается CSS, то тут мы можем двигаться только в глубину. Это означает, например, что с XPath мы сможем найти родительский элемент по дочернему.
В этом руководстве мы познакомимся с некоторами особенностями языка ХРath применительно к практике использования выражений XPath для поиска сложных или динамически подгружаемых элементов, атрибуты которых также могут динамически изменяться (обновляться).
При рассмотрении примеров, я буду использовать следующий скрипт, который осуществляет поиск элементов на странице поиска Яндекса:
Коротко о XML и XPath
Некоторые разработчики ошибочно полагают, что язык Html является подмножеством XML, но на самом деле это не так, код на обоих языка не возможно комбинировать в одном документе. Так язык XML предназначен для хранения и передачи структурированных данных. В свою очередь HTML предназначен для их более или менее читаемого отображения. Самое существенное различие между HTML и XML в том, что в HTML есть предопределенные элементы и атрибуты, поведение которых так предопределено и ожидаемо, в то время как в XML такого нет. Кроме того существуют определенные различия в синктаксисе инструкций этих внешне схожих языков.
Однако есть у этих двух языков одно основное сходство, которое, в нашем случае, мы можем эффективно использовать для поиска маршрутов к нужным элементам на странице.
Согласно методологии XPath существует пять типов узлов, которые могут находиться в дереве документа на обычной html странице:
В дальнейшем при формировании путей поиска к искомым элементам страницы мы будем иметь дело с первыми четырьмя типами узлов. И хотя технически мы можем обратиться, также и к узлу комментариев, расположенного в определенном элементе, рационального применения этой возможности при парсинге страниц нет и поэтому далее рассматриваться не будут.
Маршруты поиска
И хотя выражения XPath в Xml могут также возвращать числа, логические и строковые выражения, то есть производить обработку элементов и их содержимого. В Selenium используется лишь подмножество выражений XPath, называемых маршрутами поиска. Маршруты поиска указывают на определенный узел или набор узлов документа (элементов страницы), отвечающих заданным критериям поиска. Каждый маршрут поиска использует как минимум один шаг для идентификации узла или набора узлов документа. Этот набор может быть пустым, содержать один или содержать несколько узлов. Узел может быть корневым, узлом определенного элемента, атрибута, текста или комментария.
Абсолютные пути
Простейшим маршрутом поиска является тот, который указывает на корневой узел документа (страницы). Этот маршрут представляется простой наклонной чертой / и всегда обозначает одно и то же: корневой узел документа. Каждый документ имеет только один корневой узел, являющийся общим корнем дерева узлов. Корневой узел не имеет родительских узлов. Значением корневого узла является значение элемента документа.
Абсолютный путь представляет собой полный и уникальный путь к элементу, начиная от корневого узла. Путь полученный выше описанным способом будет иметь следующий вид:
Если вы используете в качестве тестируемого выражения XPath этот путь, и запустите на выполнение скрипт приведенный выше, то получите ссылку на логотип Яндекса, который находится на главной странице поисковика.
Абсолютный путь, по аналогии с абсолютным путем к любому файлу в файловой системе операционной системы, всегда однозначно указывает на нужный элемент. Однако у него есть один существенный недостаток: если разметка страницы изменится, то он с большой вероятностью может перестать работать. Особенно это актуально если на странице используется много различных интерактивных возможностей Javascript или анимаций элементов.
Отметим, что корневой элемент страницы имеет абсолютный путь (маршрут) /html и если в качестве XPath выражения мы введем просто ‘/’, то будет возбуждено исключения типа InvalidSelectorException с сообщением «Селектор некоректен. Результат поиска с использованием XPath выражения не возвратил объект элемента. Элемент не найден».
Вывод. Символ / объединяет различные шаги в составной маршрут поиска. Каждый шаг в маршруте является относительным по отношению к предшествующему. Если маршрут начинается с /, то путь является абсолютным, а его первый шаг является относительным по отношению к корневому узлу.
Относительные пути
Относительный путь начинается с двух наклонных черт и следующим за ним одиночным тегом нужного нам элемента. Он может идентифицировать элементы в любом месте веб-страницы. И это позволяет избегать необходимости писать весь длинный абсолютный XPath путь, и вы можете начать его с середины структуры документа страницы (DOM). Он позволяет выбрать все элементы, по заданному тегу на странице, удовлетворяющие указанному критерию поиска. Например, выражение XPath //li ссылается на все элементы li находящиеся на странице (в дереве DOM). Так относительный путь к логотипу Яндекса на странице поиска будет выглядеть следующим образом:
Логично было бы думать, что при задании относительных путей можно задавать начальную точку поиска нужных элементов страницы или, как принято говорить в терминологии XPath контекстный узел. В этом случае маршрут поиска будет иметь следующий вид:
Попробуем теперь переписать выражение выше следующим образом:
И мы получим точно такой же результат, как и для выражения выше. Фактически мы заменили все промежуточные элементы из пути к ссылкам на две наклонные черты // и упростили его вид. Таким образом можно убирать из пути к искомому элементу любое количество промежуточных шагов (элементов).
Подстановочные выражения
Звездочка * или астерикс соответствует любому узлу элемента, независимо от его типа. Звездочка * является одним из наиболее часто используемых подстановочных выражений, используемых в XPath выражениях в Selenium.
Символ @ указывает, что слдующий за ним идентификатор является наименованием атрибута элемента и используется для задания предикатов. Так выражение @ * мы можем использовать вместо любого имени атрибута.
Приведем некоторые примеры их использования.
Предикаты
Как мы уже знаем, что в общем случае выражение XPath может ссылаться более чем на один узел (элемент страницы), то есть метод, в котором оно используется будет возвравращать массив элементов. Иногда это именно то, что нам нужно, однако в некоторых случаях приходится «просеивать» его по определенным критериям, чтобы выбрать только некоторые из них. Для этих целей в XPath используется синктаксис предикатов. Каждый шаг в маршруте поиска может иметь свой предикат или даже несколько, который задает свой критерий выбора из текущего списка узлов на каждом шаге маршрута поиска. То есть на каждом шаге поиска могут существовать один или более предикатов. По сути предикат содержит логическое выражение, которое проверяется для каждого узла в полученном по указанному пути наборе элементов страницы. Если выражение ложно, этот узел удаляется из набора, в противном случае соответствено сохраняется.
Предикат – это часть выражения XPath, заключенная в квадратные скобки, которое следует в инструкции для шага поиска за критерием выбора узла (элемента). В общем виде выражение с предикатом будет выглядеть следующим образом:
Предположим, требуется найти кнопку для отправки поискового запроса на главной странице Яндекса. XPath выражение, которое позволяет это осуществить будет выглядеть следующим образом:
В следующем примере выбираем ссылку на корзину Яндекс Маркет, которая находится также на основной странице поисковика. Использование нескольких атрибутов в выражении XPath сужает поиск нужного элемента на странице до одного.
Вывод. Механизм предикатов весьма полезен для сужения диапазона выбираемых на странице элементов по заданным критериям, который основан на логических выражениях. Используя предикаты мы можем задавать сколь угодно специфичные идентификаторы для искомых элементов.
Используем индексы для указания позиции элемента
С помощью синтаксиса индексов можно выбрать из набора элементов нужный, указав его номер в квадратных скобках по аналогии с синтаксисом массивов. В примере ниже мы получаем третий элемент из списка новостей на странице Яндекса.
Используем логические операторы OR и AND в выражения XPath
Логические оператры используются в инструкциях предикатов для комбинирования критериев поиска нужных элементов на странице.
В примере ниже приведены выражения для фильтрации ссылок на новости, которые показывают на странице поиска Яндекс.
Как видно в предикате для фильтрации элементов можно применять сколько угодно логических операторов, а также комбинировать их с XPath функциями, которые рассмотрим ниже.
Используем функции языка XPath
Функция text()
Функция XPath text() – это встроенная в синтаксис XPath Selenium функция, которая используется для поиска элементов на основе строкового значения, содержащегося в его текстовом узле. То есть если элемент имеет текстовое содержимое в виде строки, то элемент можно найти следующим образом:
Функция contains()
Функция contains() часто используется в предикатах выражений XPath для случаев если значение атрибута элемента или его текстовое содержимое может динамически изменяться.
Если выражение выбора элемента переписать в указанном выше виде, то мы ориентируясь на атрибут класса элемента будем выбирать его в любом случае.
Функция contains() позволяет находить элемент по текстовой подстроке значения атрибута или его текстового содержимого, как показано в примере XPath ниже.
Функция starts-with()
Эта функция используется если нам известна первая часть (начальная подстрока) текстового содержимого искомого элемента на странице, либо часть значения его атрибута.
Функция last()
Эта функция позволяет выбрать последний элемент (указанного типа) из набора элементов. Пример ее использования представлен ниже.
Это выражение возвращает элемент, содержащий наименование последней новости из списка новостей со страницы поисковика Яндекс.
В следующем примере показано как можно получить предпоследнюю новость.
Функция position()
Используем полные маршруты поиска элементов
До этого момента мы говорили о том, что в терминологии языка XPath называется сокращенными маршрутами поиска. Эти маршруты значительно проще для набора, менее многословны и знакомы большинству разработчиков. Кроме того, они являются именно теми выражениями XPath, которые лучше всего подходят для использования в простейших шаблонов поиска. Однако в XPath также предлагается полный синтаксис для маршрутов поиска, который более многословен, но, возможно, менее загадочен и определенно более гибок.
По сути в сокращенном маршруте поиска ось и критерий узла объединены вместе. Например, следующий сокращенный маршрут поиска состоит из трех шагов.
Полные несокращенные маршруты поиска, как и сокращенные, могут быть также абсолютными, если начинаются с корневого узла.
В целом полная форма очень многословна и мало используется на практике. Однако она предоставляет одну исключительную возможность, которая делает эту форму записи XPAth выражений достойной внимания. Это единственный способ использования направлений осей поиска, по которым выражения XPath осуществляют выбор нужных элементов.
Так сокращенный синтаксис позволяет перемещаться по оси непосредственно дочерних узлов (child), оси атрибутов (attribute) и оси всех его потомков с включением контекстного узла (descendant-or-self). Полный синтаксис добавляет еще восемь осей, которые применимы для использования в XPath выражениях и поиска элементов на страницах с использованием Selenium:
Ось предков (ancestor axis)
Все узлы элементов, содержащие контекстный узел; родительский узел, родитель родителя, родитель родителя родителя и т.д. вверх вплоть до корневого узла в порядке, обратном расположению узлов в документе.
Ось следующих одноуровневых узлов (following-sibling axis)
Все узлы элементов страницы, следующие за контекстным узлом и содержащиеся в том же узле родительского элемента, в том же порядке, в каком элементы расположены в документе.
В примере выше выражение выбирает блок div по содержимому атрибута класса, который содержит элементы строки ввода слов для поиска.
Ось дочерних элементов (child axis)
Ось содержит все дочерние узлы текущего контекстного, то есть выбирает все элементы, содержащиеся в текущем узле. В примере ниже будут выбраны все элементы находящиеся внутри блока div содержащего логотип Яндекса.
Ось следующих узлов (following axis)
Ось предыдущих одноуровневых узлов (preceding-sibling axis)
Выбирает все узлы, предшествующие контекстному узлу и содержащиеся в том же узле родительского элемента последовательно в обратном порядке.
В этом примере выражение позволяет выбрать скрытые поля в блоке со строкой основного поиска Яндекса.
Ось предыдущих узлов (preceding axis)
Ось потомков (descendant axis)
Поиск вдоль оси потомков descendant выбирает все дочерние элементы, а также их дочерние элементы «внуков». В примере ниже мы выбираем все элементы находящиеся в блоке со строкой поиска на главной странице Яндекса.
Ось потомков, включая контекстный узел (descendant-or-self axis)
Ее действие аналогично оси потомков descendant за исключением того, в набор будет включен и сам контекстный узел.
Ось предков, включая контекстный узел (ancestor-or-self axis)
Все предки контекстного узла, включая сам контекстный узел. В примере ниже будут выбраны все предки элемента div блока с логотипом Яндекса, а также сам элемент.
В этой статье мы рассмотрели основы использования синтаксиса XPath при составлении выражений для поиска элементов на странице. Отличительной особенностью такого поиска является то, что используется информация о структуре документа страницы, что позволяет более гибко составлять выражения маршрутов к искомым элементам в любом направлении от заданного контекстного узла. В отличии от использования CSS селекторов, которые позволяю осуществлять поиск только в глубину, выражения XPath позволяют выбирать как родительские узлы так и узлы предков выше до любого уровня вложенности.
Использование функций языка XPath позволяет находить элементы как по их текстовому содержимому, так и по содержимому их атрибутов. Существенно расширяют их возможности возможность использования логических выражений для комбинирования различных условий формирования маршрута поиска.
Надеюсь, что это руководство поможет вам разобраться с принципом использования XPath выражений при работе в Selenium Python. А также в дальнейшем послужит справочным пособием для разработки.