Флажок выбора имеет определенные параметры с Capybara

Как мне использовать Capybara, чтобы проверить, что в поле выбора есть определенные значения, перечисленные в качестве параметров? Он должен быть совместим с Selenium...

Это HTML, который у меня есть:

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

Вот что я хочу сделать:

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

person Tom Maeckelberghe    schedule 22.03.2011    source источник
comment
Было бы полезно, если бы вы разместили свой HTML/ERB для рассматриваемого раздела.   -  person polarblau    schedule 22.03.2011


Ответы (5)


Попробуйте использовать сопоставитель rspec водосвинки have_select(locator, options = {}) вместо этого:

#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
person Jeff Perrin    schedule 22.11.2011
comment
Для пользователей RSpec я использовал page.should have_select('Something', :options => ['plain text']) - person Joe Sak; 14.12.2011
comment
@hubble, ваш комментарий обязательно должен иметь собственный ответ :) - person Gabriel Osorio; 04.11.2013
comment
Вы также можете использовать with_options, чтобы проверить, существуют ли определенные параметры, не указывая все по порядку. - person aceofspades; 01.04.2014
comment
Capybara, кажется, предполагает, что options — это полный набор, тогда как with_options позволяет использовать подмножество всех опций, что удобно для проверки того, что конкретная опция находится в выборе, не указывая все опции. Все еще ищу что-то, чтобы уточнить заказ. github.com/jnicklas/capybara/blob/ мастер/библиотека/капибара/узел/ - person peoplespete; 10.03.2016
comment
Новый синтаксис RSpec: expect(page).to have_select(...) - person everyman; 16.03.2016
comment
Спасибо @everyman, я обновил ответ с новым синтаксисом. - person Jeff Perrin; 16.03.2016
comment
has_select(locator, options = {}) page.has_select?('Language', with_options: ['English', 'German']) если вы не хотите, чтобы ваш тест провалился, если он не найден - person Yohann; 15.01.2019

Для чего бы это ни стоило, я бы назвал это раскрывающимся меню, а не полем, поэтому я бы написал:

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

Чтобы ответить на ваш вопрос, вот код RSpec для реализации этого (непроверенный):

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

Если вы хотите проверить текст параметра вместо атрибута значения (что может привести к тому, что более читаемые сценарии), вы можете написать:

  page.should have_xpath "//select[@id = '#{id}']/option[text() = '#{value}']"
person Jo Liss    schedule 24.03.2011
comment
Параметры должны быть option.. ну, я делаю это с этой страницей.should have_css('select option:contains('Audi')', :visible =› true). Почему? Код более читабелен, плюс проверяет видимость элемента... - person Tom Maeckelberghe; 25.03.2011
comment
@Tom: псевдокласс contains был выведен из спецификации CSS, поэтому я не уверен, что это будет работать везде, но в остальном CSS так же хорош (и я согласен, что он более читаем). Вы можете использовать :visible для любого метода кстати. Изучая XPath, я довольно далеко продвинулся только на примерах в спецификации (а также это). - person Jo Liss; 26.03.2011
comment
О, не сейчас, что... Жаль, что они отказались от 'contains()', он выглядит полезным. Я посмотрю примеры XPath, спасибо! - person Tom Maeckelberghe; 29.03.2011
comment
С моим rspec/capybara page.should.have_xpath не работает, а page.should have_xpath работает. - person denis.peplin; 15.11.2012

В качестве альтернативного решения, и поскольку я не знаком с xpaths, я сделал это для решения аналогичной проблемы:

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

Это довольно просто, но мне потребовалось некоторое время, чтобы понять.

person Mauricio Moraes    schedule 02.04.2014

Ну, так как я был рядом и увидел вопрос (и тестировал сегодня), решил опубликовать свой путь:

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

Then I should see "audi" within "#cars"

должен сделать трюк

person corroded    schedule 23.03.2011
comment
Спасибо, но это не работает. В огурцах вагонов было бы поле, а внутри подразумевается размах. Таким образом, стандартный шаг, который приближается к этому, звучит так: «Тогда поле cars должно содержать Audi». Но если ничего не выбрано, возвращается пустая строка: ожидаемо: /Audi/, получено: - person Tom Maeckelberghe; 24.03.2011
comment
как автомобили могут быть полем, если это явно выбранный тег? вы проверяете, существует ли опция Audi в раскрывающемся списке ваших автомобилей, верно? или вы проверяете, был ли выбран вариант? - person corroded; 24.03.2011