На моїй веб-сторінці div
є class
ім’я з ім’ям Test
.
Як я можу це знайти XPath
?
На моїй веб-сторінці div
є class
ім’я з ім’ям Test
.
Як я можу це знайти XPath
?
Відповіді:
Цей селектор повинен працювати, але буде ефективнішим, якщо замінити його на відповідну розмітку:
//*[contains(@class, 'Test')]
Або, оскільки ми знаємо, що шуканим елементом є div
:
//div[contains(@class, 'Test')]
Але оскільки це також відповідатиме випадкам на кшталт class="Testvalue"
або class="newTest"
, версія @ Томалака, подана в коментарях, краще :
//div[contains(concat(' ', @class, ' '), ' Test ')]
Якщо ви хочете бути впевнені, що він буде відповідати правильно, ви також можете використовувати функцію нормалізації-простір, щоб очистити заблукалі символи пробілів навколо назви класу (як згадує @Terry):
//div[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]
Зауважте, що у всіх цих версіях * найкраще замінити на ім’я елемента, яким ви насправді хочете відповідати, якщо ви не бажаєте шукати кожен елемент у документі для заданої умови.
//div[contains(concat(' ', @class, ' '), ' Test ')]
- Ваші також з’являться часткові матчі.
Найпростіший спосіб ..
//div[@class="Test"]
Якщо ви хочете знайти, <div class="Test">
як описано.
//
не просто /
.
Тільки правильний спосіб зробити це з допомогою XPath:
//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]
Функція normalize-space
знімає пробіли та пробіли, а також замінює послідовності символів пробілів на один пробіл.
Якщо вам не потрібно багато цих запитів Xpath, можливо, ви хочете використовувати бібліотеку, яка перетворює селектори CSS в XPath, оскільки селектори CSS, як правило, набагато простіші для читання і запису, ніж запити XPath. Наприклад, у цьому випадку ви могли використовувати обидва div[class~="Test"]
і div.Test
отримати однаковий результат.
Деякі бібліотеки мені вдалося знайти:
Я лише надаю це як відповідь, як давно подав Томалак як коментар до відповіді Медера
//div[contains(concat(' ', @class, ' '), ' Test ')]
concat(' ', normalize-space(@class), ' ')
робити з тим, щоб враховувати всілякі символи з пробілів?
//div[contains(concat(' ', @class, ' '), ' Test ')]/chid
дітей не вибирають?
Корисну функцію можна зробити з попередніх відповідей:
function matchClass($className) {
return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}
Тоді просто сформулюйте виклик функції у своєму запиті.
Ви можете знайти такі елементи, як цей приклад (усі елементи css)
private By
allElementsCss = By.xpath(".//div[@class]");