Как найти элемент по классу CSS с XPath? - PullRequest
246 голосов
/ 22 октября 2009

На моей веб-странице есть div с class с именем Test.

Как мне найти его с XPath?

Ответы [ 6 ]

395 голосов
/ 22 октября 2009

Этот селектор должен работать, но будет более эффективным, если вы замените его подходящей разметкой:

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

Или, поскольку мы знаем, что искомый элемент является div:

//div[contains(@class, 'Test')]

Но так как это также будет соответствовать случаям, таким как class="Testvalue" или class="newTest", версия @ Tomalak, предоставленная в комментариях, будет лучше :

//div[contains(concat(' ', @class, ' '), ' Test ')]

Если вы хотите быть действительноУбедившись, что он будет соответствовать правильно, вы также можете использовать функцию normalize-space для очистки блуждающих пробельных символов вокруг имени класса (как упомянуто @Terry):

//div[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]

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

128 голосов
/ 23 сентября 2014

Самый простой способ ..

//div[@class="Test"]

Предполагая, что вы хотите найти <div class="Test">, как описано.

24 голосов
/ 11 августа 2011

Я просто предоставляю это как ответ, как Томалак давал в качестве комментария к ответу медика давным-давно

//div[contains(concat(' ', @class, ' '), ' Test ')]
17 голосов
/ 14 января 2016

ТОЛЬКО правильный способ сделать это с XPath:

//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]

Функция normalize-space удаляет начальные и конечные пробелы, а также заменяет последовательности пробельных символов одним пробелом.


Примечание

Если вам не нужны многие из этих запросов Xpath, вы можете использовать библиотеку, которая преобразует селекторы CSS в XPath, поскольку селекторы CSS обычно намного проще читать и писать, чем запросы XPath. Например, в этом случае вы можете использовать и div[class~="foo"], и div.foo, чтобы получить одинаковый результат.

Некоторые библиотеки, которые мне удалось найти:

1 голос
/ 04 февраля 2016

Полезная функция может быть сделана из предыдущих ответов:

function matchClass($className) {
    return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}

Затем просто присоедините вызов функции к вашему запросу.

0 голосов
/ 03 июня 2016

вы можете найти такие элементы, как этот пример (все элементы CSS)

private By 
allElementsCss = By.xpath(".//div[@class]");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...