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

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

<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 

(如果你的默认select器是:CSS)


您的问题中的代码不起作用:

 within ".item" do first(:link, "Agree").click end 

相当于:

 find('.item').first(:link, "Agree").click 

水豚发现几个.item的,所以它引发了一个例外。 我认为水豚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可以解决一系列的匹配,并拉出一个特定的。 你应该能够匹配这个。

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

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

由于first()并不总是等待,所以这可能是有用的:

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

简单的你可以使用:

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