web-dev-qa-db-fra.com

Capybara: sélectionne 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 suivant Capybara Ruby:

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 le fais

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

C'est bon.

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

Merci

63
Paul

Cela fonctionnera pour sélectionner une option par valeur:

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

Pour conserver l'étendue du sélecteur, vous pouvez l'envelopper comme tel dans un bloc:

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

Avec Poltergeist en tant que pilote, je ne peux pas cliquer sur une option comme suggéré dans certaines des options ci-dessus. Vous pouvez plutôt effectuer les opérations suivantes:

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

39
Mark

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

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

Enregistrer dans un fichier .rb dans spec/support/

Exemple d'utilisation:

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

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

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

Cette méthode d'assistance assez astucieuse. Je le changerais un peu:

def select_by_value(id, value)

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

  find(:xpath, option_xpath).click

fin

ou juste:

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

Dans mon cas, j'ai plusieurs options avec le même texte, c'est pourquoi j'ai besoin de sélectionner par valeur. En combinant quelques réponses, j'ai trouvé la meilleure solution pour moi:

 def select_by_value (id, valeur) 
 option_xpath = "//*[@id='#{id}']/option[@value='#{valueBuch''r", __. find (: xpath, option_xpath) .select_option 
 end 
1
iRet

Cliquez avec find_field fonctionne bien:

find_field("date").find("option[value='20120905']").click
0
cage

Vous pouvez également utiliser capybara-ui qui cherchera d’abord à faire correspondre le texte, puis à la valeur.

# define your form widget, in this case in a role
class UserRole < Capybara::UI::Role
  form :my_form do
    select :my_select, 'my_select'
  end
end

# then just submit your form params via #submit
role = UserRole.new

role.submit :my_form, my_select: '20120905'

En savoir plus sur les formes capybara-ui ici .

0
steel