2015-12-15 2 views
0

Я хочу выбрать только теги (без детей/потомков), которые содержат текст.Выберите только теги, которые содержат текст с XPath в Selenium

Это то, что я ищу:

//*/descendant::text()[normalize-space()] 

Это не работает в Selenium. Есть ли способ использовать это выражение в Selenium с find_elements_by_xpath()?

+2

Что значит «не работает» означает? Разве он ничего не выбирает? Выбирает ли элементы, но не то, что вы намереваетесь? Есть ли ошибка? –

+0

Selenium выдает исключение: InvalidSelectorError: результат выражения xpath «// */descendant :: text() [normalize-space()]»: [object Text]. Это должен быть элемент. –

ответ

0

Попробуйте

//*[contains(text()='textToFind')] 

Это будет в основном ищет любой тег, содержащий указанный текст.

+0

Я не думаю, что это отвечает на вопрос. Насколько я понимаю, OP хочет найти в них элементы с _any_ текстом, а не те, которые не содержат текст без пробелов. –

+0

Матиас прав. Я хочу проверить каждый узел. Получите текст, оставьте узлы дочерних/потомков, чтобы избежать избыточности, то же самое для следующего узла. –

2

Когда вы говорите:

only tags (without children/descendants)

Я предполагаю, что вы имеете в виду никаких дочерних/узлов потомков элемента. Если это так, то это должен XPath (я не использую селен) работу ...

//*[normalize-space() and not(*)] 

Это будет выбрать любой элемент, который содержит текст (кроме пробела) и не содержит дочерний элемент.

Например, он не будет соответствовать p, но он будет соответствовать b в этом случае:

<p>text <b>more text</b></p> 
+0

Мой вопрос немного вводит в заблуждение. Я хочу выбрать каждый тег, содержащий текст. Но чтобы избежать избыточности, не их узлы элемента child/descendants. Для вашего примера: выберите текст p-узла, оставьте текст b-узла. Затем выберите текст b-узла. Выражение в моих вопросах выбирает все теги с текстом и пропускает пустые теги строки. –

+0

@salnixon - выражение в вашем вопросе выбирает узлы text(); а не элементы/теги. Вот почему вы получаете ошибку. Я все еще не уверен на 100%, что вы имеете в виду, когда говорите, что пытаетесь избежать избыточности. Если вы используете выражение '// * [text() и не (normalize-space (.) = '')]' '' '' '' '' '' '' '. Но если вход был «

больше текста

', будет выбран только 'b'. Не уверен, что это то, что вы ищете или нет. Если нет, попробуйте обновить свой вопрос с объяснением из вашего комментария. Надеюсь, кто-то сможет вам помочь. –

Смежные вопросы