【问题标题】:Select only tags that contain text with XPath in Selenium在 Selenium 中仅选择包含带有 XPath 的文本的标签
【发布时间】:2015-12-16 03:52:37
【问题描述】:

我只想选择包含文本的标签(没有子/后代)。

这就是我要找的:

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

它在 Selenium 中不起作用。有没有办法通过 find_elements_by_xpath() 在 Selenium 中使用这个表达式?

【问题讨论】:

  • “不起作用”是什么意思?它不选择任何东西吗?它是否选择元素,但不是您想要的?有错误吗?
  • Selenium 抛出异常:InvalidSelectorError: The result of the xpath expression "//*/descendant::text()[normalize-space()]" 是:[object Text]。它应该是一个元素。

标签: python selenium xpath selenium-webdriver


【解决方案1】:

当你说:

只有标签(没有孩子/后代)

我假设您的意思是没有子/后代元素节点。如果这是正确的,这个 xpath 应该(我不使用 selenium)工作......

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

这将选择任何包含文本(空格除外)且不包含子元素的元素。

例如,它不会匹配p,但在这种情况下会匹配b

<p>text <b>more text</b></p>

【讨论】:

  • 我的问题有点误导。我想选择每个包含文本的标签。但是为了避免冗余而不是他们的子/后代元素节点。对于您的示例:选择 p 节点文本,省略 b 节点文本。然后选择 b 节点文本。我的问题中的表达式选择所有带有文本的标签,并跳过空字符串标签。
  • @salnixon - 您问题中的表达式选择 text() 节点;不是元素/标签。这就是您收到错误的原因。当你说你试图避免冗余时,我仍然不能 100% 确定你的意思。如果您使用表达式//*[text() and not(normalize-space(.)='')],则pb 都会被选中。但如果输入为&lt;p&gt;&lt;b&gt;more text&lt;/b&gt;&lt;/p&gt;,则只会选择b。不确定这是否是您正在寻找的东西。如果没有,请尝试使用您评论中的解释更新您的问题。希望有人能帮助你。
【解决方案2】:

试试

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

这基本上会查找包含指定文本的任何标签。

【讨论】:

  • 我认为这不能回答问题。据我了解,OP 希望找到其中包含 any 文本的元素,而不是那些不包含任何非空白文本的元素。
  • 马蒂亚斯是对的。我想检查每个节点。获取文本,省略子/后代节点以避免冗余,然后对下一个节点进行相同的操作。
  • 应该是//*[contains(text(),'textToFind')]
猜你喜欢
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
相关资源
最近更新 更多