XPath является мощным инструментом для поиска элементов на веб-странице, особенно когда стандартные локаторы, такие как CSS-селекторы, не могут быть использованы. В WebDriverIO XPath используется для поиска элементов в DOM, когда нужно точное соответствие или сложная логика поиска. В этой статье рассмотрены продвинутые техники работы с XPath, которые могут значительно упростить тестирование и повысить стабильность автоматизации.
XPath (XML Path Language) — это язык запросов, используемый для навигации по элементам в XML-документах. В контексте веб-тестирования он помогает найти элементы на страницах, используя их структуры. XPath позволяет выполнять сложные запросы, такие как поиск по атрибутам, тексту, расположению элементов и их иерархии.
Пример простого XPath-запроса:
const element = await $('#elementId');
Однако для более сложных структур используется комбинация базовых XPath-операторов.
XPath состоит из нескольких важных операторов и выражений, которые обеспечивают гибкость в поиске элементов:
/ — используется для навигации по элементам, начиная от
корня.// — ищет элементы по всему дереву DOM, начиная с
текущего уровня.@ — используется для поиска по атрибутам.[] — фильтрация элементов по условиям.Пример выражения:
const element = await $('//div[@class="example"]');
Одним из самых мощных способов локализации элементов является поиск по тексту внутри них. XPath предоставляет несколько операторов для работы с текстом:
text() — используется для получения текстового
содержимого элемента.contains(text(), "text") — находит элементы, содержащие
определённый фрагмент текста.normalize-space() — удаляет лишние пробелы, что полезно
для поиска элементов с текстами, где пробелы могут изменяться.Примеры:
// Элемент с точным текстом
const element = await $('//button[text()="Submit"]');
// Элемент, содержащий текст
const element = await $('//button[contains(text(), "Submit")]');
// Элемент с текстом, игнорирующим лишние пробелы
const element = await $('//div[normalize-space(text())="Hello World"]');
Поиск элементов по атрибутам — это один из основных подходов в XPath.
С помощью оператора @ можно фильтровать элементы по любому
атрибуту.
@attribute="value" — точное совпадение атрибута.@attribute — проверка наличия атрибута.@attribute!="value" — исключение элементов с
определённым значением атрибута.starts-with(@attribute, "prefix") — поиск элементов, у
которых атрибут начинается с указанной строки.contains(@attribute, "substring") — поиск элементов, у
которых атрибут содержит подстроку.Пример:
// Поиск элемента с определённым классом
const element = await $('//input[@type="text"]');
// Поиск элемента с атрибутом, начинающимся с определённой строки
const element = await $('//a[starts-with(@href, "https://example.com")]');
XPath позволяет перемещаться не только по текущим элементам, но и по родительским и дочерним элементам.
parent:: — поиск родительского элемента.child:: — поиск дочерних элементов.ancestor:: — поиск предков элемента.descendant:: — поиск потомков элемента.following-sibling:: — поиск следующих соседей.preceding-sibling:: — поиск предыдущих соседей.Пример:
// Поиск родительского элемента для элемента с классом "child"
const parent = await $('//div[@class="child"]/parent::*');
// Поиск всех ссылок внутри элемента
const links = await $('//div[@class="container"]/descendant::a');
Когда на странице существует несколько одинаковых элементов, XPath позволяет точечно указать, какой именно из них нужно выбрать. Это делается с помощью индексов.
position().Примеры:
// Первый элемент с классом "item"
const firstItem = await $('(//div[@class="item"])[1]');
// Последний элемент с классом "item"
const lastItem = await $('(//div[@class="item"])[last()]');
XPath поддерживает логические операторы, такие как and,
or и not, которые позволяют строить более
сложные запросы.
and — оба условия должны быть выполнены.or — хотя бы одно условие должно быть выполнено.not — условие должно быть ложным.Пример:
// Поиск элемента с классом "button" и атрибутом "disabled"
const button = await $('//button[@class="button" and @disabled]');
// Поиск элемента, не содержащего текст "Submit"
const element = await $('//button[not(text()="Submit")]');
XPath-запросы могут быть ресурсозатратными, особенно на больших страницах с множеством элементов. Для улучшения производительности следует:
//div.descendant:: или ancestor::.XPath может быть использован не только в WebDriverIO, но и в
сочетании с другими методами поиска. WebDriverIO предоставляет несколько
функций для работы с элементами, например, $('selector'),
$$('selector'), где XPath может быть использован в качестве
селектора. Также можно комбинировать XPath с CSS-селекторами для
нахождения более сложных структур.
Пример:
// Использование XPath вместе с CSS-селектором
const element = await $('div.example > button[class="submit"]');
XPath также отлично работает с динамическими элементами на страницах, где ID или другие атрибуты могут изменяться. В таких случаях полезно использовать такие техники, как поиск по частичному атрибуту или по тексту.
Пример:
// Элемент с изменяющимся атрибутом
const element = await $('//button[contains(@id, "submit-")]');
// Элемент с уникальным текстом
const element = await $('//div[contains(text(), "Login")]');
Использование XPath в WebDriverIO предоставляет широкие возможности для поиска элементов на странице, включая работу с текстом, аттрибутами, отношениями между элементами и динамическими изменениями. Понимание основных и продвинутых техник XPath позволяет создавать гибкие и производительные тесты, которые легко адаптируются к различным структурам веб-страниц.