web-dev-qa-db-fra.com

capybara click_link avec: correspondance href

J'ai le test suivant dans une spécification de demande:

page.should have_link('Edit user', :href => edit_users_path(@user))

Cela vérifie qu'un utilisateur spécifique dans une vue d'index dispose d'un lien d'édition. Je voudrais cliquer sur le même lien, avec quelque chose comme:

click_link('Edit user', :href => edit_users_path(@user))

Malheureusement, click_link n'accepte pas les options.

Existe-t-il un bon moyen de le faire, cela semble être un cas d'utilisation assez évident?

Dois-je inclure un #id dans le tableau <tr> ou <td> et faire quelque chose comme:

within(#user_id)
  click_link 'Edit user'
end

Je préfère ne pas bricoler avec la vue juste pour que les tests fonctionnent.

32
jackpipe

vous pouvez utiliser find find(:xpath, "//a[@href='/foo']").click

42
jvnill

Pour ce faire, vous pouvez utiliser l'interface de niveau inférieur de Capybara. Essayer:

find("a[href='#{edit_users_path}']").click
16
diabolist

J'ai fini par ajouter un module d'assistance dans spec/support/selectors.rb

module Selectors
  Capybara.add_selector(:linkhref) do
    xpath {|href| ".//a[@href='#{href}']"}
  end
end

Puis dans les tests que j'utilise

find(:linkhref, some_path).click
11
jackpipe

Sur la base de la réponse @jackpipe (et de mon expérience précédente), je construis mon propre sélecteur Capybara, voici le code du module d'assistance (spec/support/selectors.rb):

module Selectors
  # find(:href, 'google.com')
  Capybara.add_selector(:href) do
    xpath {|href| XPath.descendant[XPath.attr(:href).contains(href)] }
  end
end

Exemple d'utilisation:

find(:href, 'google')

Quelle est la différence?

Eh bien, cela trouvera tout lien contenant "google". Les éléments suivants correspondront:

www.google.com
http://google.com
fonts.google.com
something.google.inside.com

De plus, il ne recherchera que parmi les sélecteurs descendants, par exemple within('header') { find(:href, 'google').click } fonctionnera correctement.

5
jmarceli

Laisser le premier argument vide semble fonctionner pour moi ...

page.should have_link("", :href=>edit_comment_path(@comment))
1
vanboom