Je dois écrire des tests pour un site Web. J'essaie d'obtenir la valeur sélectionnée d'une liste déroulante. Jusqu'à présent, je peux obtenir le contenu de la liste déroulante en faisant
find_field('restrictions__rating_movies').text
retours - Ne pas autoriser les films G PG M R13 R15 R16 R18 R RP16 Autoriser tous les films
Je peux obtenir la valeur de l'objet sélectionné.
find_field('restrictions__rating_movies').value
retours - 1000
Cela ne m'aide pas beaucoup car j'essaie d'obtenir le texte de l'élément sélectionné dans une liste déroulante.
<select class="" id="restrictions__rating_movies" name="restrictions[][rating_movies]">
<option value="0">Don't Allow Movies</option>
<option value="100">G</option>
<option value="200">PG</option>
<option value="300">M</option>
<option value="325">R13</option>
<option value="350">R15</option>
<option value="375">R16</option>
<option value="400">R18</option>
<option value="500">R</option>
<option value="600">RP16</option>
<option value="1000" selected="selected">Allow All Movies</option></select>
dans ce cas, j'ai besoin d'obtenir la valeur "Autoriser tous les films". J'ai essayé de nombreuses combinaisons différentes des deux exemples ci-dessus.
find_field('restrictions__rating_movies').find('option[selected]').text
Il y a un have_select
matcher si vous utilisez Capybara avec Rspec:
expect(page).to have_select('my-select', selected: 'Option 2')
Un moyen très simple d'obtenir la valeur de l'option sélectionnée est:
find("#restrictions__rating_movies").value
Cela renverra la valeur sélectionnée de l'option sélectionnée.
Si vous avez seulement besoin d'affirmer si un champ est sélectionné avec une option donnée, la réponse directe est
#Find a select box by (label) name or id and assert the given text is selected
When /^select box "([^"]*)" is selected with "([^"]*)"$/ do |dropdown, selected_text|
assert page.has_select?(dropdown, selected: selected_text)
end
Mais le titre de votre question est "Get select value for dropdown" . Et j'ai rencontré un problème similaire où je voudrais non seulement affirmer la sélection, mais aussi récupérer le texte et la valeur du champ sélectionné. Je n'ai trouvé aucun moyen direct sur l'API. La façon la plus simple que j'ai trouvée était: #all("option").find &:selected?
When /^ select box "([^"]*)" is selected with "([^"]*)"$/ do |dropdown, selected_text|
sb = find_field(dropdown)
sb_selected = sb.all("option").find &:selected?
msg = "Selected: #{sb_selected.text.inspect} - value:#{sb_selected.value.inspect}"
assert page.has_select?(dropdown, selected: selected_text), msg
end
Cela me donne un message d'erreur plus complet lorsque l'assertion échoue.
S'il y a plusieurs sélections, vous pouvez utiliser #select à la place de #find, comme dans #all("option").select &:selected?
. Il renverra un tableau.
Cette réponse ne repose pas sur l'astuce "option [sélectionnée]" comme les précédentes, elle fonctionne donc même si la sélection est effectuée par Javascript (ce qui était la raison pour laquelle les réponses précédentes ne fonctionnaient pas du tout pour moi).
Testé sur:
capybara (2.2.1)
capybara-webkit (1.1.0)
cucumber (1.3.14)
cucumber-Rails (1.4.0)
Si vous voulez trouver le texte actuellement sélectionné, sans supposer ce qu'il pourrait être afin que vous puissiez simplement le comparer à une attente, ce qui suit fonctionne même si la sélection a été effectuée par JS (de sorte qu'il n'y a pas d'option [sélectionné]) ).
Je trouve d'abord la valeur de la sélection, puis je trouve le texte de l'option avec cette valeur:
def selected(selector)
value = find(selector).value
text = find(selector).find("option[value='#{value}']").text
end