Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Основные оси в XPath
В XPath оси (axes) определяют направление поиска узлов относительно контекстного узла (context node) — текущей точки в дереве документа. Они позволяют строить пути, учитывая родственные связи между элементами (родители, дети, предки, потомки, соседи). Оси являются фундаментальной частью языка XPath и критически важны для написания устойчивых и точных локаторов в автоматизации тестирования, особенно при работе с сложными или динамически изменяющимися DOM-структурами.
Список и описание основных осей
Стандарт XPath 1.0 и 2.0 определяет следующие основные оси:
-
child(дети): Выбирает прямых детей контекстного узла. Это наиболее часто используемая ось, часто опускается в сокращённой записи (например,//divвместо//child::div).//table/child::tr /* Выбирает все строки <tr>, являющиеся прямыми детьми таблицы <table> */ -
parent(родитель): Выбирает прямого родителя контекстного узла.//input[@id='login']/parent::form /* Выбирает форму <form>, которая является родителем поля ввода с id='login' */ -
ancestor(предки): Выбирает всех предков (родителя, родителя родителя и т.д.) контекстного узла вверх по дереву до корня.//span[text()='Error']/ancestor::div[@class='modal'] /* Находит ближайший (или любой) контейнер div с классом 'modal', содержащий текст 'Error' */ -
descendant(потомки): Выбирает всех потомков (детей, детей детей и т.д.) контекстного узла вниз по дереву.//div[@id='content']/descendant::p /* Выбирает все параграфы <p> внутри div с id='content', независимо от глубины вложенности */ -
ancestor-or-self(предки и себя): Выбирает всех предков контекстного узла и сам контекстный узел.//li/ancestor-or-self::*[@class='active'] /* Проверяет, является ли сам элемент <li> или любой его предок активным (имеет класс 'active') */ -
descendant-or-self(потомки и себя): Выбирает всех потомков контекстного узла и сам контекстный узел. Часто используется в сокращённой записи//.//body/descendant-or-self::*[contains(text(), 'Welcome')] /* Ищет текст 'Welcome' в любом месте внутри тела документа */ -
following(следующие): Выбирает все узлы, которые появляются в документе после контекстного узла (исключая потомков).//h1/following::p /* Выбирает все параграфы <p>, которые находятся после заголовка <h1> в документе, но не внутри него */ -
preceding(предшествующие): Выбирает все узлы, которые появляются в документе до контекстного узла (исключая предков).//summary/preceding::h2 /* Выбирает все заголовки <h2>, которые находятся перед элементом <summary> в документе */ -
following-sibling(следующие соседи): Выбирает все узлы-соседи (т.е. узлы на том же уровне дерева с общим родителем), которые находятся после контекстного узла.//li[@class='first']/following-sibling::li /* Выбирает все следующие элементы списка <li> после первого элемента с классом 'first' */ -
preceding-sibling(предшествующие соседи): Выбирает все узлы-соседи, которые находятся до контекстного узла.//li[@class='last']/preceding-sibling::li /* Выбирает все предыдущие элементы списка <li> перед последним элементом с классом 'last' */ -
attribute(атрибуты): Выбирает атрибуты контекстного узла. В сокращённой записи обозначается символом@.//img/attribute::src /* Выбирает значение атрибута src всех изображений <img> */ /* Сокращённая запись: //img/@src */ -
self(сам себя): Выбирает контекстный узел сам по себе. Часто используется для проверки условий.//button[self::button[disabled]] /* Выбирает все кнопки <button>, которые имеют атрибут disabled */ -
namespace(пространства имен): Выбирает узлы пространств имен контекстного узла. Используется реже, преимущественно в XML с неймспейсами.
Практическое применение в QA Automation
Понимание осей позволяет создавать точные и устойчивые локаторы, что критически важно для автоматизации:
- Устойчивость к изменениям структуры DOM: Использование осей
ancestor,descendantилиfollowing-siblingчасто делает локаторы менее зависимыми от абсолютного пути, который может легко измениться при рефакторинге фронтенда. - Поиск элементов в сложных иерархиях: Например, для поиска кнопки в конкретной строке таблицы, но не во всей таблице:
//tr[td[text()='John Doe']]/descendant::button[text()='Edit'] - Валидация отношений между элементами: Можно проверять, что один элемент находится перед другим (
preceding), или что у элемента есть определённый родительский контейнер (parent,ancestor). - Извлечение данных из атрибутов: Ось
attribute(или@) незаменима для получения значенийhref,src,data-idи т.д.
Таким образом, глубокое знание осей XPath не просто отвечает на вопрос собеседования, но и напрямую влияет на качество и надежность автоматизированных тестов, позволяя эффективно взаимодействовать с любыми, даже самыми сложными, веб-интерфейсами.