2011-03-22 72 views
38

如何使用水豚检查选择框是否将某些值列为选项? 它必须与硒兼容...检查选择框与水豚有一定的选项

这是我有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" 
+1

如果您可以发布有关该部分的HTML/ERB,这将会很有帮助。 – polarblau 2011-03-22 18:34:00

回答

57

尝试使用水豚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 
+35

对于RSpec用户,我使用'page.should have_select('Something',:options => ['纯文本'])' – 2011-12-13 21:36:32

+1

@hubble您的评论应该肯定有自己的回复:) – 2013-11-04 09:46:43

+9

您可以还可以使用'with_options'来检查具体的选项是否存在,而不是全部按顺序排列 – aceofspades 2014-03-31 22:13:49

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

应该做的诀窍

+0

谢谢,但它不工作。在黄瓜“汽车”将是一个“领域”和“内”意味着一个范围。所以接近的标准步骤是'那么“汽车”字段应该包含“奥迪”。但是,如果没有选择任何东西,它会返回一个空字符串:预计:/奥迪/, 得到:“” – 2011-03-24 09:51:36

+0

当它明显是一个选择标签时汽车如何能成为一个领域?你正在检查奥迪选项是否存在于你的车下拉右边?或者你在检查它是否是选定的选项? – corroded 2011-03-24 17:04:33

22

为什么它的价值,我会称它为下拉菜单,而不是字段,所以我会写:

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 

如果你想测试选项文本,而不是值属性(这可能使对more readable场景),你可以写:

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

男人我开始学习xpath ..谢谢 – 2011-03-25 13:22:10

+1

选项应该是选项..啊,我正在做这个页面。应该have_css('选择选项:包含('奥迪')',:可见=>真)。为什么?代码更具可读性,并且检查元素是否可见... – 2011-03-25 14:04:09

+0

@Tom:'contains'伪类[已从CSS规范中取出](http://www.w3.org/TR/css3-选择器/#内容选择器),所以我不确定这是否会在任何地方工作,但除此之外,CSS是一样好(我同意它更可读)。顺便说一下,您可以在[任一方法]上使用:visible(http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Matchers#has_xpath%3F-instance_method)。重新学习XPath,我只用[规范中的示例](http://www.w3.org/TR/xpath/#path-abbrev)(和[这些也是](http: //www.w3.org/TR/xpath/#location-paths))。 – 2011-03-26 12:47:26

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 
11

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

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

它很简单,但花了我一些时间弄清楚。

+2

非常适合调试:) – 2015-04-10 12:12:25