2011-03-22 48 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

相關問題