Comment sélectionner une option dans le menu déroulant à l’aide de Capybara

J’essaie de sélectionner un élément dans un menu déroulant en utilisant Capybara (2.1.0).

Je veux sélectionner par numéro (ce qui signifie sélectionner la deuxième, troisième, etc.).

J’ai googlé comme un fou en essayant toutes sortes de choses mais pas de chance.

J’ai pu le sélectionner en utilisant la valeur:

find("option[value='4c430d62-f1ba-474f-8e8a-4452c55ea0a8']").click 

Mais je ne veux pas utiliser cette méthode b / c la valeur est quelque chose qui changera et qui rendra mon test fragile.

Le code HTML pour le menu déroulant est le suivant:

   Choose...  Institution1  Institution / test   

J’ai aussi essayé ceci:

  option = find(:xpath, "//*[@id='organizationSelect']/option[2]").text select(option, :from => organizationSelect) 

Mais cela se traduit par cette erreur:

 Ambiguous match, found 2 elements matching option "Institution" (Capybara::Ambiguous) 

Alors, comment puis-je sélectionner la première, la deuxième, la troisième, etc. de la liste déroulante (en utilisant Capybara)?

Si vous examinez la source de la méthode select , vous pouvez voir que ce qu’elle fait lorsque vous passez une clé from est essentiellement:

 find(:select, from, options).find(:option, value, options).select_option 

En d’autres termes, il trouve le vous intéresse, puis trouve l’ dans ce select_option , puis appelle select_option sur le noeud .

Vous avez déjà fait les deux premières choses, je les réorganiserais. Ensuite, vous pouvez select_option méthode select_option à la fin:

 find('#organizationSelect').find(:xpath, 'option[2]').select_option 

Pour une raison quelconque, cela n’a pas fonctionné pour moi. Donc j’ai utilisé autre chose

 select "option_name_here", :from => "organizationSelect" 

travaillé pour moi

Malheureusement, la réponse la plus populaire n’a pas fonctionné entièrement pour moi. J’ai dû append .select_option à la fin de la déclaration

select("option_name_here", from: "organizationSelect").select_option

sans l’ select_option , aucune sélection n’était effectuée

une autre option consiste à append une méthode comme celle-ci

  def select_option(css_selector, value) find(:css, css_selector).find(:option, value).select_option end 

Ce n’est pas une réponse directe, mais vous pouvez (si votre serveur le permet):

1) Créez un modèle pour votre organisation; extra: il sera plus facile de remplir votre HTML.

2) Créez une usine (FactoryGirl) pour votre modèle;

3) créer une liste (create_list) avec la fabrique;

4) ‘pick’ (sample) une organisation de la liste avec:

 # Random select option = Organization.all.sample # Select the FIRST(0) by id option = Organization.all[0] # Select the SECOND(1) after some ressortingction option = Organization.where(some_attr: some_value)[2] option = Organization.where("some_attr OP some_value")[2] #OP is "=", "< ", ">", so on... 

Pour append une autre réponse à la stack (car apparemment il y a tellement de façons de le faire en fonction de votre configuration) – je l’ai fait en sélectionnant l’élément d’ option littérale et en cliquant dessus

 find(".some-selector-for-dropdown option[value='1234']").select_option 

Ce n’est pas très joli, mais ça marche: /

aucune des réponses n’a fonctionné pour moi en 2017 avec capybara 2.7. J’ai eu “ArgumentError: mauvais nombre d’arguments (donné 2, attendu 0)”

Mais cela a fait:

 find('#organizationSelect').all(:css, 'option').find { |o| o.value == 'option_name_here' }.select_option