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