在这种情况下如何点击第一个链接:
<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
答案 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)
尝试以下方法:
within ".item" do
click_link("Agree", :match => :first)
end
来源:
答案 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出色的等待功能
first(".active").click
如果页面上还没有.active元素,则first将返回nil,并且单击将失败。
如果您想确保只有一个
find(".active").click
如果只需要第一个元素
find(".active", match: :first).click
水豚将等待元素出现,然后再尝试单击。
请注意,match: :first
较为脆弱,因为如果您引入匹配的新元素,它将默默地单击其他元素。
答案 6 :(得分:-2)
简单你可以使用:
$('.item').find('a').first().click();