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:
-
all
et first
n'attendez pas d'élément avec une telle locator apparaîtra sur la page find
n'attendez
-
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"