web-dev-qa-db-fra.com

Obtenez la valeur sélectionnée de la liste déroulante pour les tests de capybara

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.

56
Brandon
find_field('restrictions__rating_movies').find('option[selected]').text
40
Brandon

Il y a un have_select matcher si vous utilisez Capybara avec Rspec:

expect(page).to have_select('my-select', selected: 'Option 2')
152
gylaz

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.

13
Vijay Chouhan

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

Source: http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Matchers#has_select%3F-instance_method

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)
3
Abinoam Jr.

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
2
Adam Ehven