web-dev-qa-db-fra.com

Comment cliquer sur le premier lien dans la liste des éléments après la mise à niveau vers Capybara 2.0?

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
120
tomekfranek

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.

173
Andrei Botalov
111
adamdboudreau

Ce phrasé fonctionne aussi:

within first(".item") do
  click_link "Agree"
end
21
Elle Mundy

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 
4
DGM

Puisque first () n'attend pas toujours, c'est peut-être utile:

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

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

Mauvais:

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.

Bien:

Si vous voulez vous assurer qu'il y a exactement un
find(".active").click

Si vous voulez juste le premier élément
find(".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.

0
Salomanuel