升级到 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 后如何点击项目列表中的第一个链接?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Visual Studio 2010 将项目从 .Net 2.0 升级到 .Net 4.0?

PInvoke在 2.0 3.0的时候正常 升级到4.0后出错。

一些JS运行后如何让Capybara检查可见性?

访问被拒绝并获取 抱歉,在 grails 中将插件 Spring Security 核心升级到 2.0 版本后,您无权查看此页面

如何在 rspec 中使用 capybara 点击下拉选项

springboot 升级到2.0后 context-path 配置 不起作用,不生效 不管用 皆是因为版本改动导致的在这里记录一下