升级到 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后出错。
访问被拒绝并获取 抱歉,在 grails 中将插件 Spring Security 核心升级到 2.0 版本后,您无权查看此页面
springboot 升级到2.0后 context-path 配置 不起作用,不生效 不管用 皆是因为版本改动导致的在这里记录一下