升级到Capybara 2.0后如何点击项目列表中的第一个链接?

时间:2013-01-25 00:29:30

标签: ruby rspec capybara

在这种情况下如何点击第一个链接:

<div class="item">
  <a href="/agree/">Agree</a>
</div>
<div class="item">
  <a href="/agree/">Agree</a>
</div>
within ".item" do
  first(:link, "Agree").click
end

我收到此错误:

Capybara::Ambiguous:
  Ambiguous match, found 2 elements matching css ".item"

没有within我收到此错误:

Failure/Error: first(:link, "Agree").click
NoMethodError:
  undefined method `click' for nil:NilClass

7 个答案:

答案 0 :(得分:170)

你可以使用:

first('.item').click_link('Agree')

first('.item > a').click

(如果你的默认选择器是:css)


您问题中的代码无效:

within ".item" do
  first(:link, "Agree").click
end

相当于:

find('.item').first(:link, "Agree").click

Capybara找到了几个.item,因此它引发了异常。我认为Capybara 2的这种行为非常好。

答案 1 :(得分:109)

答案 2 :(得分:21)

这句话也有效:

within first(".item") do
  click_link "Agree"
end

答案 3 :(得分:4)

Xpath可以解决该元素。我还不是很好,但是像//div[@class='active'][1]/a

这样的东西

这可能有效,也可能无效,但关键是xpath可以解决匹配数组并拉出一个匹配项。你应该能够与之匹敌。

我的一个项目的一个工作示例示例:

within page.find("div.panel", text: /Proposals/) do
  within page.find('tr', text: /Foo/) do
    page.should have_xpath('td[3]', text: @today)
  end
end

答案 4 :(得分:2)

由于first()并不总是等待,所以这可能很有用:

expect(page).to have_css("selector")                               
first("selector").click

答案 5 :(得分:0)

其中大多数解决方案都不会使用Capybara出色的等待功能

如此链接所建议的那样做:
https://thoughtbot.com/blog/write-reliable-asynchronous-integration-tests-with-capybara#find-the-first-matching-element

坏:

first(".active").click
如果页面上还没有.active元素,则first将返回nil,并且单击将失败。

好:

如果您想确保只有一个
find(".active").click

如果只需要第一个元素
find(".active", match: :first).click
水豚将等待元素出现,然后再尝试单击。

请注意,match: :first较为脆弱,因为如果您引入匹配的新元素,它将默默地单击其他元素。

答案 6 :(得分:-2)

简单你可以使用:

$('.item').find('a').first().click();