选中框与Capybara有一些选项

Tom*_*ghe 41 selenium ruby-on-rails cucumber 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>
Run Code Online (Sandbox Code Playgroud)

这就是我想要做的:

Then the "cars" field should contain the option "audi"
Run Code Online (Sandbox Code Playgroud)

Jef*_*rin 64

尝试使用capybara rspec matcher has_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
Run Code Online (Sandbox Code Playgroud)

  • 对于那里的RSpec用户,我使用了`page.should have_select('Something',:options => ['plain text'])` (35认同)
  • 您还可以使用`with_options`来检查特定选项是否存在而不按顺序指定所有选项 (9认同)
  • 较新的 RSpec 语法:`expect(page).to have_select(...)` (2认同)

Jo *_*iss 22

对于它的价值,我称之为下拉菜单,而不是字段,所以我写道:

Then the "cars" drop-down should contain the option "audi"
Run Code Online (Sandbox Code Playgroud)

要回答你的问题,这里是实现这个(未经测试)的RSpec代码:

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

如果要测试选项文本而不是value属性(这可能会产生更多可读方案),您可以编写:

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


Mau*_*aes 12

作为替代解决方案,并且由于我不熟悉xpath,我这样做是为了解决类似的问题:

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

它很简单,但花了我一些时间才弄明白.


Dan*_*iel 11

好吧,因为我在附近,看到了问题(并且今天进行了测试)决定发布我的方式:

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