XPath: найти HTML-элемент по * простой * текст
обратите внимание: более уточненный вариант этого вопроса, с соответствующим ответом можно найти здесь.
Я хотел бы использовать привязки Selenium Python для поиска элементов с заданным текстом на веб-странице. Например, предположим, что у меня есть следующий HTML:
<html>
<head>...</head>
<body>
<someElement>This can be found</someElement>
<someOtherElement>This can <em>not</em> be found</someOtherElement>
</body>
</html>
мне нужно искать по тексту и я могу найти <someElement>
используя следующий XPath:
//*[contains(text(), 'This can be found')]
Я ищу аналогичный XPath, который позволяет мне найти <someOtherElement>
С помощью простые текст "This can not be found"
. Не работает следующее:
//*[contains(text(), 'This can not be found')]
Я понимаю, что это из-за вложенных em
элемент, который "нарушает" поток текста "это не может быть найдено". Возможно ли через XPaths, в некотором роде, игнорировать такие или подобные вложения, как выше?
1 ответов
можно использовать //*[contains(., 'This can not be found')]
.
контекстного узла .
будет преобразован в его строковое представление перед сравнением с "это не может быть найдено".
будьте осторожны если вы используете //*
, так что он будет соответствовать все englobing элементы, содержащие эту строку.
в вашем примере он будет соответствовать:
<someOtherElement>
- и
<body>
- и
<html>
!
можно ограничить конкретным элементом тегам или определенного раздела В документе (а <table>
или <div>
С известным идентификатором или классом)
Edit для вопроса OP в комментарии о том, как найти наиболее вложенные элементы, соответствующие текстовому условию:
принятый ответ здесь предполагает //*[count(ancestor::*) = max(//*/count(ancestor::*))]
для выбора наиболее вложенного элемента. Я думаю, что это только XPath 2.0.
в сочетании с вашим состоянием подстроки я смог