41 votes

La case à cocher a certaines options avec Capybara

Comment utiliser Capybara pour vérifier qu'une boîte de sélection contient certaines valeurs comme options ? Il faut que ce soit compatible avec Selenium...

C'est 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>

C'est ce que je veux faire :

Then the "cars" field should contain the option "audi"

64voto

Jeff Perrin Points 4603

Essayez d'utiliser le matcheur rspec de Capybara. 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

22voto

Jo Liss Points 6692

Pour ce que ça vaut, j'appellerais cela un menu déroulant, pas un champ, donc 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 souhaitez tester le texte de l'option au lieu de l'attribut de valeur (ce qui pourrait rendre plus lisible scénarios), vous pourriez écrire :

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

12voto

Mauricio Moraes Points 1723

Comme solution alternative, et comme je ne suis pas familier avec les xpaths, j'ai fait ceci 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 il m'a fallu du temps pour le comprendre.

11voto

Daniel Points 1171

Eh bien, puisque j'étais dans le coin et que j'ai vu la question (et que j'ai fait des essais aujourd'hui), j'ai décidé de poster ma version :

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

3voto

corroded Points 9116
Then I should see "audi" within "#cars"

devrait faire l'affaire

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