Найти тему

Сравнение XPATH и CSS. Как найти в DOM (html или xml)?

Оглавление

Давайте подробно рассмотрим, как XPath и CSS-селекторы работают с элементами DOM, сравним их синтаксис и функциональные возможности.

Мы разберём наиболее важные аспекты, такие как выбор элементов по классу, идентификатору, атрибутам, иерархии и другим характеристикам. Для каждого случая приведём примеры, как это реализовать с помощью XPath и CSS-селекторов, а также примеры структуры DOM-дерева.

1. Выбор элемента по тегу

Пример DOM:

CSS-селектор:

div

XPath:

//div

Объяснение: В обоих случаях селектор просто выбирает все элементы с указанным тегом (div).

2. Выбор элемента по идентификатору (id)

Пример DOM:

-2

CSS-селектор:

#main-content

XPath:

//*[@id='main-content']

Объяснение: В CSS-селекторах для выбора элемента по идентификатору используется символ #, а в XPath мы выбираем элементы с атрибутом id, равным "main-content".

3. Выбор элемента по классу

Пример DOM:

-3

CSS-селектор:

.header

XPath:

//*[@class='header']

Объяснение: В CSS-селекторах для выбора элемента по классу используется символ ".", а в XPath мы выбираем элементы с атрибутом class, равным "header".

4. Выбор элемента по атрибуту

Пример DOM:

-4

CSS-селектор:

input[type='text']

XPath:

//input[@type='text']

Объяснение: В CSS-селекторах можно выбрать элемент по атрибуту с помощью квадратных скобок [], в XPath используется аналогичная конструкция с @ перед именем атрибута.

5. Выбор элемента по частичному совпадению атрибута

Пример DOM:

-5

CSS-селектор:

[class*='primary']

XPath:

//*[contains(@class, 'primary')]

Объяснение: В CSS-селекторах символ *= используется для поиска элементов, в которых атрибут содержит указанное значение. В XPath используется функция contains() для аналогичного поиска.

6. Выбор дочерних элементов

Пример DOM:

-6

CSS-селектор:

div > span

XPath:

//div/span

Объяснение: В CSS-селекторах символ > указывает на выбор элемента, который является прямым потомком. В XPath используется аналогичная конструкция с косой чертой /.

7. Выбор всех потомков (вложенных элементов)

Пример DOM:

-7

CSS-селектор:

div *

XPath:

//div//*

Этот XPath-селектор работает аналогично CSS-селектору div * и выбирает все элементы, которые являются потомками div, независимо от их типа и уровня вложенности.

Объяснение: В CSS и XPath можно выбрать все вложенные элементы, используя пробел в CSS и двойную косую черту // в XPath.

  • Если целью является выбор всех элементов внутри родительского контейнера, то можно использовать универсальные селекторы: div * (CSS) или //div//* (XPath).
  • Если нужно выбрать только элементы определённого типа (например, только span), то можно использовать селекторы, которые явно указывают на нужный тег. Например div span или //div//span

8. Выбор элемента по порядковому номеру (nth-child)

Пример DOM:

-8

CSS-селектор:

ul li:nth-child(2)

XPath:

//ul/li[2]

Объяснение: В CSS используется псевдокласс :nth-child() для выбора элемента на основе его позиции среди всех дочерних элементов. В XPath квадратные скобки [2] указывают на выбор второго элемента.

9. Выбор элемента по текстовому содержимому

Пример DOM:

-9

CSS-селектор:

/* CSS не поддерживает выбор по тексту */

XPath:

//p[text()='Important message!']

Объяснение: В CSS-селекторах нет возможности выбирать элементы на основе их текстового содержимого, в то время как XPath поддерживает такую функциональность с помощью конструкции text().

10. Выбор элемента по соседям ниже (братьям)

Пример DOM:

-10

CSS-селектор:

  • Селектор + — выбирает только следующий соседний элемент.
div + p

Этот селектор выберет только элемент <p>, который непосредственно следует за <div>.

  • Селектор ~ — выбирает всех последующих соседей на том же уровне, которые следуют за <div>.
div ~ p

Этот селектор выберет все элементы <p>, которые располагаются после <div>, независимо от того, какие другие элементы находятся между ними. В данном случае, он также выберет элемент <p>, так как он идёт после <div>, но не обязательно сразу за ним.

XPath:

  • Чтобы выбрать непосредственного соседа (аналог CSS-селектора +):
//div/following-sibling::p[1]

Этот XPath-селектор выберет только элемент <p>, который непосредственно следует за <div>.

  • Чтобы выбрать всех последующих соседей (аналог CSS-селектора ~):
//div/following-sibling::p

Этот XPath-селектор выберет всех следующих братьев типа <p>, которые идут после <div>.

Объяснение:

  • Селектор + в CSS выбирает только следующий соседний элемент (непосредственного брата).
  • Селектор ~ в CSS выбирает всех последующих соседей на том же уровне (всех братьев, начиная с первого после элемента).
  • В XPath для выбора непосредственного соседа используется following-sibling::element[1], а для всех последующих соседей — following-sibling::element.

11. Выбор предыдущих соседей (preceding-sibling)

Пример DOM:

-11

Допустим, мы находимся на элементе <div>, и нам нужно выбрать его предыдущих соседей (все элементы, которые находятся перед ним на том же уровне вложенности).

CSS-селектор:

CSS не поддерживает выбор предыдущих соседей. В CSS можно выбирать только элементы, расположенные после указанного элемента (вперед по иерархии), с помощью селекторов + и ~, но выбрать предыдущих соседей невозможно.

XPath:

  • Чтобы выбрать непосредственного предыдущего соседа (ближайшего брата):
//div/preceding-sibling::*[1]

Этот селектор выберет элемент <p>, который находится непосредственно перед <div>.

  • Чтобы выбрать всех предыдущих соседей:
//div/preceding-sibling::*

Этот XPath-селектор выберет всех братьев, которые находятся перед <div>, то есть и <span>, и <p>.

12. Выбор последнего элемента

Пример DOM:

-12

CSS-селектор:

ul li:last-child

XPath:

//ul/li[last()]

Объяснение: В CSS используется псевдокласс :last-child, в то время как в XPath используется функция last() для выбора последнего элемента.

13. Выбор родительского элемента

Пример DOM:

-13

CSS-селектор:

/* CSS не поддерживает выбор родителя */1

XPath:

//span/parent::div

Объяснение: CSS-селекторы не поддерживают выбор родительских элементов, в то время как XPath позволяет это делать с помощью оси parent::.

Сравнительная таблица XPath и CSS-селекторов

-14

Заключение

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

В статье приведены не все возможности XPath и CSS селекторов. Пишите в комментариях, чего бы еще хотелось узнать.

-15

Вместо оглавления. Что вы найдете на канале QA Helper - справочник тестировщика?

Не забудьте подписаться на канал, чтобы не пропустить полезную информацию: QA Helper - справочник тестировщика

Пишите в комментариях какой пункт было бы интересно рассмотреть более подробно.

Обязательно прочитайте: Что должен знать и уметь тестировщик

Также будет интересно почитать: Вопросы которые задают на собеседовании тестировщикам.