如何在忽略内部元素文本的同时在Capybara中查找元素的文本

时间:2016-07-19 22:02:28

标签: ruby selenium xpath capybara nokogiri

在下面的HTML示例中,我尝试抓取外部span.price元素中的$ 16.95文本,并从内部span.sale中排除文本。

<div class="price">
  <span class="sale">
    <span class="sale-text">"Low price!"</span>
    "$16.95"
  </span>
</div>

如果我使用Nokogiri,这不会太难。

price = doc.css('sale')
price.search('.sale-text').remove
price.text

然而,Capybara导航而不是删除节点。我知道price.text之类的内容会从所有子元素中获取文本,因此我尝试使用xpath更具体。 p.find(:xpath, "//span[@class='sale']", :match => :first).text。但是,这也会从内部元素中获取文本。

最后,我尝试循环遍历所有跨度,看看我是否可以分离结果,但是我得到了一个不明确的错误。

p.find(:css, 'span').each { |result| puts result.text }
Capybara::Ambiguous: Ambiguous match, found 2 elements matching css "span"

我正在使用Capybara / Selenium,因为这是一个带有身份验证并发症的网络报废项目。

1 个答案:

答案 0 :(得分:1)

由于内部文本的DOMs概念并不真正支持您想要做的事情,因此没有单一的声明方式与Capybara一起执行此操作。假设p是'。$'元素,您可以通过以下两种方式获得所需内容:

  1. 由于您知道要忽略的节点,只需从整个文本中删除该文本

    p.find('span.sale').text.sub(p.find('span.sale-text').text, '')
    
  2. 抓住innerHTML字符串并用Nokogiri或Capybara.string解析它(它只包含Capybara DSL中的Nokogiri元素)

    doc = Capybara.string(p['innerHTML'])
    nokogiri_fragment = doc.native
    #do whatever you want with the nokogiri fragment