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.

в сочетании с вашим состоянием подстроки я смог