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

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

<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
85610 次浏览

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

你可以用:

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

或者

first('.item > a').click

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


你的问题中的代码不起作用:

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

等同于:

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

水豚发现了几个 .item,所以它提出了一个例外。我认为这种行为的水豚2非常好。

这种措辞也有效:

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

简单易用:

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

由于 first ()并不总是等待,也许这是有用的:

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

这些解决方案大多不会使用水豚的辉煌等待功能

最好按照这种联系所暗示的那样做:
Https://thoughtbot.com/blog/write-reliable-asynchronous-integration-tests-with-capybara#find-the-first-matching-element

坏:

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

好:

如果你想确定的话
find(".active").click

如果你只想要第一个元素
find(".active", match: :first).click
水豚会等到元素出现后再点击。

请注意,match: :first比较脆弱,因为如果引入匹配的新元素,它将静默地单击另一个元素。