Как я могу найти элемент класса CSS с XPath?

На моей веб-странице есть div с классом Test. Как я могу найти его с помощью XPath?

Ответ 1

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

//*[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 ')]

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

Ответ 2

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

//div[@class="Test"]

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

Ответ 3

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

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

Ответ 4

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

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

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


Примечание

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

Некоторые библиотеки, которые я смог найти:

Ответ 5

Более общие связанные решения XPath, CSS, DOM и Selenium можно найти в документе XPath, CSS, DOM и Selenium: Rosetta Stone.

В частности, ваш ответ можно найти в идентификаторе и имени элемента.

Ответ 6

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

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

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

Ответ 7

вы можете найти элементы, подобные этому примеру (все элементы css)

private By 
allElementsCss = By.xpath(".//div[@class]");