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

Posted

技术标签:

【中文标题】升级到 Capybara 2.0 后如何点击项目列表中的第一个链接?【英文标题】:How to click first link in list of items after upgrading to Capybara 2.0? 【发布时间】:2013-01-08 22:03:51 【问题描述】:

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

<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

【问题讨论】:

【参考方案1】:

Xpath 可以寻址元素。我还不是很擅长,但是像//div[@class='active'][1]/a

这可能有效,也可能无效,但关键是 xpath 可以处理一组匹配项并提取一个特定的匹配项。你应该可以匹配到这个。

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

在 page.find("div.panel", text: /Proposals/) 内做 在 page.find('tr', text: /Foo/) 内做 page.should have_xpath('td[3]', text: @today) 结尾 结尾

【讨论】:

【参考方案2】:

你可以使用:

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

【讨论】:

我建议不要使用#first,它不会等待元素存在:rubydoc.info/github/jnicklas/capybara/…。如果内容是在运行时使用 JS first 创建的,如果它在创建链接之前运行期望,则返回 nil。【参考方案3】:

尝试以下方法:

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

【讨论】:

太棒了。它适用于简单的 page.find('#css', :match => :first).click 干杯以获得真正有用​​的答案【参考方案4】:

这个措辞也有效:

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

【讨论】:

为我工作,谢谢。 Capybara 2.4.1 和 poltergeist。【参考方案5】:

简单易用:

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

【讨论】:

这个例子与水豚无关 那不是 jQuery 吗?【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

【讨论】:

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

以上是关于升级到 Capybara 2.0 后如何点击项目列表中的第一个链接?的主要内容,如果未能解决你的问题,请参考以下文章