99 votes

Capybara L'Ambiguïté De La Résolution

Comment puis-je résoudre l'ambiguïté dans le Capybara? Pour une raison que j'ai besoin de liens avec les mêmes valeurs dans une page mais je ne peux pas créer un test car j'ai l'erreur

Failure/Error: click_link("#tag1")
     Capybara::Ambiguous:
       Ambiguous match, found 2 elements matching link "#tag1"

La raison pourquoi je ne peux pas éviter ce est en raison de la conception. Je suis en train de recréer la page twitter avec des tweets/tags sur le droit et les tags sur la gauche de la page. Par conséquent, il sera inévitable que les mêmes liens de la page s'affiche sur la même page.

149voto

e-zinc Points 2480

Ma solution est

first(:link, link).click

au lieu de

click_link(link)

75voto

Andrey Botalov Points 6566

Un tel comportement de Capybara est intentionnelle et je crois qu'il ne devrait pas être fixe, comme suggéré dans la plupart des autres réponses.

Les Versions de Capybara avant 2.0 retourné le premier élément, au lieu de lever une exception, mais plus tard, les responsables de Capybara a décidé que c'est une mauvaise idée et c'est mieux pour l'élever. Il a été décidé que, dans de nombreuses situations de retour au premier élément conduit à un retour pas l'élément que le développeur a voulu être retournés.

La plupart des upvoted réponse ici vous recommandons d'utiliser first ou all au lieu de find mais:

  1. all et first n'attendez pas d'élément avec une telle locator apparaîtra sur la page find n'attendez
  2. all(...).first et first ne sera pas vous protéger de la situation qu'à l'avenir, un autre élément avec un tel repérage peut apparaître sur la page et que le résultat vous pouvez trouver incorrect élément

Donc, il est conseillé de choisir un autre, moins ambigu locator: par exemple, sélectionnez l'élément par son id, classe ou d'autres css/xpath localisateur de sorte qu'un seul élément de match.


Comme une note, ici, sont quelques-uns des localisateurs que j'ai l'habitude de juger utiles lors de la résolution de l'ambiguïté:

  • find('ul > li:first-child')

    C'est plus utile qu' first('ul > li') qu'il va attendre jusqu'à la première li s'affiche sur la page.

  • click_link('Create Account', match: :first)

    C'est mieux que d' first(:link, 'Create Account').click qu'il faudra attendre au moins jusqu'à un lien Créer un Compte s'affiche sur la page. Cependant, je pense qu'il est préférable de choisir unique localisateur qui n'apparaît pas sur la page deux fois.

  • fill_in('Password', with: 'secret', exact: true)

    exact: true dit Capybara pour trouver uniquement les correspondances exactes, c'est à dire de ne pas trouver de "Confirmation du Mot de passe"

27voto

Greg L Points 71

La solution ci-dessus fonctionne très bien, mais pour les curieux, vous pouvez également utiliser la syntaxe suivante.

click_link(link_name, match: :first)

Vous pouvez trouver plus d'informations ici:

http://taimoorchangaizpucitian.wordpress.com/2013/09/06/capybara-click-link-different-cases-and-solutions/

24voto

Amit Kumar Gupta Points 2129

NOUVELLE RÉPONSE:

Vous pouvez essayer quelque chose comme

all('a').select {|elt| elt.text == "#tag1" }.first.click

Il y a peut être un moyen de ce faire une meilleure utilisation de l'Capybara la syntaxe -- quelque chose le long des lignes de all("a[text='#tag1']").first.click mais je ne peux pas penser de la bonne syntaxe pour la main et je ne trouve pas la documentation appropriée. Cela dit, il est un peu étrange situation, pour commencer, d'avoir deux <a> tags avec le même id, class, et le texte. Est-il une chance qu'ils sont les enfants de différents vrd, car vous pourriez alors faire votre find within le segment approprié de la DOM. (Il permettrait de voir un peu de votre source HTML).


VIEILLE RÉPONSE: (où j'ai pensé '#tag1 " le sens de l'élément a un id de "tag1")

Lequel de ces liens ne vous souhaitez, cliquez sur? Si c'est la première (ou il n'a pas d'importance), vous pouvez le faire

find('#tag1').click

Sinon vous pouvez faire

all('#tag1')[1].click

cliquez sur le deuxième.

5voto

Skydan Points 180

En raison de ce post, vous pouvez résoudre le problème par l'intermédiaire de "match" option:

Capybara.configure do |config|
  config.match = :prefer_exact
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X