【问题标题】:How do I get the HTML in an element using Capybara?如何使用 Capybara 获取元素中的 HTML?
【发布时间】:2018-04-18 18:25:35
【问题描述】:

我正在编写一个黄瓜测试,我想在其中获取元素中的 HTML。

例如:

within 'table' do
  # this works
  find('//tr[2]//td[7]').text.should == "these are the comments" 

  # I want something like this (there is no "html" method)
  find('//tr[2]//td[7]').html.should == "these are the <b>comments</b>" 
end

有人知道怎么做吗?

【问题讨论】:

    标签: cucumber capybara


    【解决方案1】:

    可以调用 HTML DOM innerHTML 属性:

    find('//tr[2]//td[7]')['innerHTML']
    

    应该适用于任何浏览器或驱动程序。 你可以在w3schools查看所有可用的属性

    【讨论】:

    • 也适用于poltergeist
    【解决方案2】:

    这篇文章很旧,但我想我找到了一个方法,如果你仍然需要它。

    要从 Capybara 元素访问 Nokogiri 节点(使用 Capybara 1.0.0beta1,Nokogiri 1.4.4),请尝试以下操作:

    elem = find('//tr[2]//td[10]')
    node = elem.native
    #This will give you a Nokogiri XML element
    
    node.children[1].attributes["href"].value.should == "these are the <b>comments</b>"
    

    最后一部分可能因您而异,但您应该能够在该节点变量中的某处找到 HTML

    【讨论】:

    • 使用 Selenium,这个答案对我不起作用,但 this one 起作用。
    【解决方案3】:

    在我的环境中,find 返回一个 Capybara::Element - 响应上述 Eric Hu 的 :native 方法,该方法返回一个 Selenium::WebDriver::Element(对我而言)。然后 :text 获取内容,所以它可以很简单:

    results = find(:xpath, "//td[@id='#{cell_id}']")
    contents = results.native.text
    

    如果您正在查找表格单元格的内容。 Capybara::Element 上没有内容、inner_html、inner_text 或节点方法。假设人们不只是在编造东西,也许你会得到与 find 不同的东西,这取决于你用 Capybara 加载的其他内容。

    【讨论】:

      【解决方案4】:

      看起来你可以使用(node).native.inner_html 来获取 HTML 内容,例如使用这样的 HTML:

      <div><strong>Some</strong> HTML</div>
      

      您可以执行以下操作:

      find('div').native.inner_html
      => '<strong>Some</strong> HTML'
      

      【讨论】:

      • 不适合所有人undefined method inner_html for #&lt;Capybara::Poltergeist::Node:0x007ff9aa8c59a0&gt;
      【解决方案5】:

      我遇到了与 Cyril Duchon-Doris 相同的问题,根据https://github.com/teampoltergeist/poltergeist/issues/629,访问 Capybara::Poltergeist::Node 的 HTML 的方法是通过 outerHTML 属性,例如:

      find('//tr[2]//td[7]')['outerHTML']
      

      【讨论】:

        【解决方案6】:

        大多数其他答案仅在 Racktest 中有效(因为它们使用 Racktest 特定的功能)。

        如果您的驱动程序支持 javascript 评估(如 Selenium),您可以使用 innerHTML

        html = page.evaluate_script("document.getElementById('my_id').innerHTML")
        

        【讨论】:

          【解决方案7】:

          尝试在其上调用 find('//tr[2]//td[10]').node 以获取实际的 nokogiri 对象

          【讨论】:

            【解决方案8】:

            如果您使用 Poltergeist 驱动程序,这些方法将允许您检查匹配项:

            http://www.rubydoc.info/gems/poltergeist/1.5.1/Capybara/Poltergeist/Node

            例如:

            page.find('[name="form-field"]').native.value == 'something'
            

            【讨论】:

              【解决方案9】:

              嗯,Capybara 使用 Nokogiri 来解析,所以这个页面可能比较合适:

              http://nokogiri.org/Nokogiri/XML/Node.html

              我相信content 是您正在寻找的方法。

              【讨论】:

              • 没有评论方法...试过这样做:find('//tr[2]//td[10]').content
              • 你能发布你的实际步骤吗?看看你在这里做什么会很有帮助。我已经完成了 page.find(...) 并参考了 Nokogiri 文档来解析响应。也许我只是幸运...注意我说的是page.find。我认为 Capybara 提供了 Webrat 提供响应对象的页面对象。
              • 步骤内容在原帖中。
              • inner_html() 应该为您提供给定节点内的所有内容。 inner_text() 应该给你节点内的所有文本。
              【解决方案10】:

              您也可以切换到capybara-ui 并执行以下操作:

              # define your widget, in this case in your role
              class User < Capybara::UI::Role
                widget :seventh_cell, [:xpath, '//tr[2]//td[7]']
              end
              
              # then in your tests
              role = User.new
              
              expect(role.widget(:seventh_cell).html).to eq(<h1>My html</h1>)
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2013-05-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-06-09
                • 2022-11-10
                • 2021-05-16
                相关资源
                最近更新 更多