66 votes

Capybara : Sélectionner une option par valeur et non par texte

Pour le HTML

<select id="date">
  <option value="20120904">Tue 4 Sep 2012</option>
  <option value="20120905">Wed 5 Sep 2012</option>
  <option value="20120906">Thu 6 Sep 2012</option>
</select>

J'ai le code Ruby Capybara suivant :

select "20120905", :from => "date"

Mais cette erreur avec :

cannot select option, no option with text '20120905' in select box 'date' (Capybara::ElementNotFound)

Cependant, si je fais

select "Wed 5 Sep 2012", :from => "date"

C'est bon.

Est-il possible de sélectionner une option dans Capybara en Valeur pas Texte ?

Gracias

75voto

rhenderson Points 890

Cela permettra de sélectionner une option par valeur :

find("option[value='20120905']").click

Pour conserver la portée du sélecteur, vous pouvez l'intégrer dans un bloc within :

within '#date' do
  find("option[value='20120905']").click
end

23 votes

Après être passé de Selenium à Poltergeist, j'ai constaté que cette méthode ne fonctionnait pas. Donc remplacée par find('#select_id').find('option[value="1"]').select_option Désolé pour le mauvais anglais.

1 votes

@woto Toutes ces options ne fonctionnent pas pour moi. En principe, l'option est trouvée sans problème. J'ai vérifié le résultat et il trouve l'option correcte, mais il ne clique pas ou ne la sélectionne pas. Je pense qu'il faut d'abord ouvrir la sélection avant de sélectionner l'option.

39voto

mkrmr Points 525

Avec Poltergeist comme conducteur, je ne peux pas cliquer sur une option comme suggéré dans certaines des autres options ci-dessus, mais vous pouvez faire ce qui suit :

page.find_by_id('date').find("option[value='20120905']").select_option

0 votes

Super utile. J'ai créé une méthode d'aide dans spec/support/capybara.rb : def select_option params id = params[:id] value = params[:value] page.find_by_id(id).find("option[value='#{value}']").select_option end

3 votes

click cause pour moi The element you are trying to interact with is either not part of the DOM, or is not currently visible on the page mais select_option fonctionne très bien pour moi. Merci !

0 votes

C'est également la réponse pour capybara-webkit.

21voto

d_rail Points 2074

J'ai écrit une méthode d'aide :

def select_by_value(id, value)
  option_xpath = "//*[@id='#{id}']/option[@value='#{value}']"
  option = find(:xpath, option_xpath).text
  select(option, :from => id)
end

Sauvegarder dans un fichier .rb dans spec/support/

Exemple d'utilisation :

before do
  select_by_value 'some_field_id', 'value'
  click_button 'Submit'
end

0 votes

Nom révélateur d'intentions, belle mise en œuvre. Merci.

0 votes

Cette version semble (encore) être la seule qui fonctionne sans javascript et qui est quelque peu indépendante du pilote ...

4voto

TrashyMcTrash Points 307

Vous pouvez également y parvenir en procédant comme suit :

find_by_id('date').find("option[value='20120905']").click

3voto

GeneK Points 11

Cette méthode d'aide est plutôt intelligente. Je la changerais juste un peu :

def select_by_value(id, value)

  option_xpath = "//*[@id='#{id}']/option[@value='#{value}']"

  find(:xpath, option_xpath).click

end

ou juste :

find(:xpath, "//select[@id='date']/option[@value='20120904']").click

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X