如何在Capybara / Nokogiri的文档中找到具有.foo类的第n个元素

时间:2013-04-11 08:50:49

标签: ruby capybara capybara-webkit

我正在尝试找到文档中有特殊类的第n个元素。元素不一定是同一父元素的子元素。例如,

<ul>
  <li><div class="foo">This</div></li>
  <li><div>Nothing</div>
    <ul>
      <li><div class="foo">This also</div></li>
    </ul>
  </li>
  <li><div class="foo">And this</div><li>
</ul>

我想找到包含.foo类的第一,第二或第三个元素。

我试过

page.find '.foo'

Capybara::Ambiguous: Ambiguous match, found 3 elements matching css ".foo"

中的哪些错误

然后我尝试了

page.all('.foo')[n]

除了它似乎没有像Capybaras find那样等待这个小小的时间之外,哪个很好用,因为HTML实际上是从ajax数据生成的。那么如何正确地使用find?

2 个答案:

答案 0 :(得分:1)

好的,在freenode的#RubyOnRails上进行了一次简短的聊天后,我发现这并不像听起来那么容易。问题是Capybara无法知道已插入页面的.foo是否是“全部”。这就是为什么.all没有(或不需要)像.find这样的等待支持。

解决方案是手动等待适当的时间,然后使用.all

答案 1 :(得分:-1)

Nokogiri的CSS查询可以有效地查找某些类的元素。它在the tutorial中解释。

例如,您可以使用以下Ruby one-liner从给定文件中读取并找到类foo的第二个元素:

ruby -rnokogiri -e 'puts Nokogiri::HTML(readlines.join).css(".foo")[1]' sample.html

返回

<div class="foo">This also</div>

[1]中的数字替换为您要查找的元素的索引,并将sample.html替换为您要搜索的html文件。如果您想挑选元素的某些部分你可以使用Nokogiri::XML::Element的方法,例如content获取其内容。