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.
в сочетании с вашим состоянием подстроки я смог