Comment cliquer sur le premier lien dans ce cas:
<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
et j'obtiens cette erreur:
Capybara::Ambiguous:
Ambiguous match, found 2 elements matching css ".item"
Et sans le within
je reçois cette erreur:
Failure/Error: first(:link, "Agree").click
NoMethodError:
undefined method `click' for nil:NilClass
Vous pouvez simplement utiliser:
first('.item').click_link('Agree')
ou
first('.item > a').click
(si votre sélecteur par défaut est: css)
Le code dans votre question ne fonctionne pas comme:
within ".item" do
first(:link, "Agree").click
end
est équivalent à:
find('.item').first(:link, "Agree").click
Capybara trouve plusieurs .item
est donc une exception. Je considère que ce comportement de Capybara 2 est très bon.
Essayez ce qui suit:
within ".item" do
click_link("Agree", :match => :first)
end
Sources:
Ce phrasé fonctionne aussi:
within first(".item") do
click_link "Agree"
end
Xpath peut s’adresser à l’élément. Je ne suis pas encore très bon avec ça, mais quelque chose comme //div[@class='active'][1]/a
Cela peut ou peut ne pas fonctionner, mais le fait est que xpath peut traiter un tableau de correspondances et en extraire un en particulier. Vous devriez être capable de correspondre avec cela.
Un exemple de travail de l'un de mes projets:
dans page.find ("div.panel", texte:/Proposals /) faire dans page.find ('tr', texte:/Foo /) faire page .should have_xpath ('td [3]', texte: @ aujourd'hui] end end
Puisque first () n'attend pas toujours, c'est peut-être utile:
expect(page).to have_css("selector")
first("selector").click
la plupart de ces solutions n'utiliseront pas les brillantes fonctionnalités d'attente de Capybara
mieux faire comme le suggère ce lien:
https://thoughtbot.com/blog/write-reliable-asynchronous-integration-tests-with-capybara#find-the-first-matching-element
first(".active").click
S'il n'y a pas encore d'élément .active sur la page, NULL retournera d'abord et le clic échouera.
Si vous voulez vous assurer qu'il y a exactement unfind(".active").click
Si vous voulez juste le premier élémentfind(".active", match: :first).click
Capybara attendra que l’élément apparaisse avant d’essayer de cliquer.
Notez que match: :first
est plus fragile, car il cliquera silencieusement sur un élément différent si vous introduisez de nouveaux éléments qui correspondent.