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


125

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

<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

Answers:


176

您可以使用:

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的这种行为非常好。


4
我建议不要使用#first,它不要等待元素存在:rubydoc.info/github/jnicklas/capybara/…。如果内容是在运行时使用JS创建的,则在创建链接之前运行预期的内容时,它将首先返回nil。
dgtized



4

Xpath可以处理元素。我现在还不太好,但是像//div[@class='active'][1]/a

那也许行不通,但是重点是xpath可以解决一组匹配项并提取特定的匹配项。您应该能够与此匹配。

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

在page.find(“ div.panel”,文本:/ Proposals /)中执行
  在page.find('tr',文本:/ Foo /)中
    page.should have_xpath('td [3]',text:@today)
  结束
结束

2

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

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

2

这些解决方案中的大多数将不会使用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它比较脆弱,因为如果您引入匹配的新元素,它将默默地单击其他元素。


我相信这是最准确的答案。
katericata

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.