使用 Waitr 从文本中排除 <span> 的内容

Excluding contents of <span> from text using Waitr

瓦提尔

mytext =browser.element(:xpath => '//*[@id="gold"]/div[1]/h1').text

Html

<h1>
 This is the text I want
 <span> I do not want this text </span>
</h1>

当我 运行 我的 Watir 代码时,它会选择所有文本,包括 span 中的内容。我如何只得到文本“这是我想要的文本”,而没有跨度文本?

最好从尝试避免使用 XPath 开始。 Watir 最强大的功能之一是能够在没有 XPath 语法的情况下创建复杂的定位器。 问题是在节点上调用文本会获取该节点内的所有内容。您需要执行以下操作:

top_level = browser.element(id: 'gold')
h1_text = top_level.h1.text
span_text = top_level.h1.span.text
desired_text = h1_text.chomp(span_text)

如果你有一个更复杂的 HTML,我发现使用 Nokogiri 可以更容易地处理这个问题,因为它提供了更多的方法来解析 HTML:

require 'nokogiri'

h1 = browser.element(:xpath => '//*[@id="gold"]/div[1]/h1')
doc = Nokogiri::HTML.fragment(h1.html)
mytext = doc.at('h1').children.select(&:text?).map(&:text).join.strip 

这对于顶级文本很有用。

如果只有一个h1,可以省略id

@b.h1.text.remove(@b.h1.children.collect(&:text).join(' '))

或有更多则指定

@b.h1(id: 'gold').text.remove(@b.h1.children.collect(&:text).join(' '))

将其设为一个方法并使用 get_top_text(@b.h1) 从您的脚本中调用它以获取它

def get_top_text(el)
    el.text.chomp(@b.h1.children.collect(&:text).join(' '))
end