在这种情况下如何点击第一个链接:
<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
您可以使用:
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 的这种行为非常好。
尝试以下操作:
within ".item" do
click_link("Agree", :match => :first)
end
资料来源:
http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Actions#click_link-instance_method
https://github.com/jnicklas/capybara#strategy
这个措辞也有效:
within first(".item") do
click_link "Agree"
end
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
这些解决方案中的大多数都不会使用 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
Capybara 会等待元素出现,然后再尝试点击。
请注意,match: :first
更脆弱,因为如果您引入匹配的新元素,它会默默地点击不同的元素。
由于 first() 并不总是等待,也许这很有用:
expect(page).to have_css("selector")
first("selector").click
很简单,您可以使用:
$('.item').find('a').first().click();
不定期副业成功案例分享