ruby - rack_test - ¿Cómo hacer clic en el primer enlace en la lista de elementos después de actualizar a Capybara 2.0?
gem capybara rails (6)
Cómo hacer clic en el primer enlace en ese caso:
<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
y obtengo este error:
Capybara::Ambiguous:
Ambiguous match, found 2 elements matching css ".item"
Y sin el within
obtengo este error:
Failure/Error: first(:link, "Agree").click
NoMethodError:
undefined method `click'' for nil:NilClass
Como first () no siempre espera, quizás esto sea útil:
expect(page).to have_css("selector")
first("selector").click
Esta frase también funciona:
within first(".item") do
click_link "Agree"
end
Pruebe lo siguiente:
within ".item" do
click_link("Agree", :match => :first)
end
Fuentes:
Puedes simplemente usar:
first(''.item'').click_link(''Agree'')
o
first(''.item > a'').click
(si su selector predeterminado es: css)
El código en tu pregunta no funciona como:
within ".item" do
first(:link, "Agree").click
end
es equivalente a:
find(''.item'').first(:link, "Agree").click
Capybara encuentra varios .item
por lo que plantea una excepción. Considero que este comportamiento de Capibara 2 es muy bueno.
Simple que puedes usar:
$(''.item'').find(''a'').first().click();
Xpath puede abordar el elemento. Todavía no soy muy bueno con esto, pero algo como //div[@class=''active''][1]/a
Eso puede o no funcionar, pero el punto es que xpath puede abordar una matriz de coincidencias y sacar una en particular. Deberías poder hacer coincidir esto.
Un ejemplo de ejemplo de trabajo de uno de mis proyectos:
within page.find("div.panel", text: /Proposals/) do within page.find(''tr'', text: /Foo/) do page.should have_xpath(''td[3]'', text: @today) end end