← Назад к вопросам

Какие знаешь оси в XPath?

1.7 Middle🔥 231 комментариев
#Selenium и UI автоматизация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основные оси в 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

Понимание осей позволяет создавать точные и устойчивые локаторы, что критически важно для автоматизации:

  1. Устойчивость к изменениям структуры DOM: Использование осей ancestor, descendant или following-sibling часто делает локаторы менее зависимыми от абсолютного пути, который может легко измениться при рефакторинге фронтенда.
  2. Поиск элементов в сложных иерархиях: Например, для поиска кнопки в конкретной строке таблицы, но не во всей таблице:
    //tr[td[text()='John Doe']]/descendant::button[text()='Edit']
    
  3. Валидация отношений между элементами: Можно проверять, что один элемент находится перед другим (preceding), или что у элемента есть определённый родительский контейнер (parent, ancestor).
  4. Извлечение данных из атрибутов: Ось attribute (или @) незаменима для получения значений href, src, data-id и т.д.

Таким образом, глубокое знание осей XPath не просто отвечает на вопрос собеседования, но и напрямую влияет на качество и надежность автоматизированных тестов, позволяя эффективно взаимодействовать с любыми, даже самыми сложными, веб-интерфейсами.