web-dev-qa-db-fra.com

Cochez la case a certaines options avec Capybara

Comment utiliser Capybara pour vérifier qu'une case de sélection a certaines valeurs répertoriées comme options? Il doit être compatible avec le sélénium ...

Voici le HTML que j'ai:

<select id="cars"> 
  <option></option>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>

Voici ce que je veux faire:

Then the "cars" field should contain the option "audi"
42
Tom Maeckelberghe

Essayez d'utiliser le matcher capybara rspec have_select (locator, options = {}) à la place:

#Find a select box by (label) name or id and assert the given text is selected
Then /^"([^"]*)" should be selected for "([^"]*)"$/ do |selected_text, dropdown|
  expect(page).to have_select(dropdown, :selected => selected_text)
end

#Find a select box by (label) name or id and assert the expected option is present
Then /^"([^"]*)" should contain "([^"]*)"$/ do |dropdown, text|
  expect(page).to have_select(dropdown, :options => [text])
end
66
Jeff Perrin

Pour ce que ça vaut, je l'appellerais un menu déroulant, pas un champ, alors j'écrirais:

Then the "cars" drop-down should contain the option "audi"

Pour répondre à votre question, voici le code RSpec pour implémenter ceci (non testé):

Then /^the "([^"]*)" drop-down should contain the option "([^"]*)"$/ do |id, value|
  page.should have_xpath "//select[@id = '#{id}']/option[@value = '#{value}']"
end

Si vous voulez tester le texte de l'option au lieu de l'attribut value (ce qui pourrait donner des scénarios plus lisibles ), vous pouvez écrire:

  page.should have_xpath "//select[@id = '#{id}']/option[text() = '#{value}']"
22
Jo Liss

Comme solution alternative, et comme je ne connais pas les xpaths, j'ai fait cela pour résoudre un problème similaire:

page.all('select#cars option').map(&:value).should == %w(volvo saab mercedes audi)

C'est assez simple, mais cela m'a pris du temps pour comprendre.

12
Mauricio Moraes

Eh bien, depuis que je suis là et que j'ai vu la question (et que j'ai testé aujourd'hui), j'ai décidé de poster mon chemin:

within("select#cars") do
  %w(volvo saab mercedes audi).each do |option|
    expect(find("option[value=#{option}]").text).to eq(option.capitalize)
  end
end
11
Daniel
Then I should see "audi" within "#cars"

devrait faire l'affaire

3
corroded