На моїй веб-сторінці 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]");