【问题标题】:How to find an element's text in Capybara while ignoring inner element text如何在忽略内部元素文本的情况下在 Capybara 中查找元素的文本
【发布时间】:2016-11-22 23:34:30
【问题描述】:

在下面的 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 =&gt; :first).text。但是,这也会从内部元素中获取文本。

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

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

我正在使用 Capybara/Selenium,因为这是一个具有身份验证复杂性的网络抓取项目。

【问题讨论】:

    标签: ruby selenium xpath capybara nokogiri


    【解决方案1】:

    Capybara 没有单一的语句方式来执行此操作,因为 innerText 的 DOM 概念并不真正支持您想要执行的操作。假设p 是“.price”元素,您可以通过以下两种方式获得所需内容:

    1. 既然您知道要忽略的节点,只需从整个文本中减去该文本

      p.find('span.sale').text.sub(p.find('span.sale-text').text, '')
      
    2. 获取 innerHTML 字符串并使用 Nokogiri 或 Capybara.string 解析它(它只是将 Nokogiri 元素包装在 Capybara DSL 中)

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

    【讨论】:

    • 欣赏答案,但我最终只是用 Capybara 抓取 html 并用 Nokogiri 处理。我需要浏览许多结果页面,并且解析与缓慢的 Capybara 节点和奇怪的 JS 效果相结合,使得脚本通常会抛出 StaleElementReferenceError。
    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 2011-05-05
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多