2013-11-21 48 views
98

我試圖從使用水豚(2.1.0)的下拉菜單中選擇一個項目。如何使用水豚選擇下拉選項

我想按數字選擇(意思是選擇第二,第三等選項)。

我瘋狂谷歌搜索各種各樣的東西,但沒有運氣。

我能夠通過使用值來選擇它:

find("option[value='4c430d62-f1ba-474f-8e8a-4452c55ea0a8']").click 

但我不希望使用方法B/C的值是什麼,將會改變,這將讓我的測試脆。

的下拉是HTML:

<td class="value"> 
    <select name="organizationSelect" id="organizationSelect" class="required"> 
    <option value="NULL">Choose...</option> 
    <option value="4c430d62-f1ba-474f-8e8a-4452c55ea0a8">&nbsp;Institution1</option> 
    <option value="e1a4efa7-352d-410a-957e-35c8a3b92944">&nbsp;Institution/test</option> 
    </select> 
</td> 

我也試過這樣:

option = find(:xpath, "//*[@id='organizationSelect']/option[2]").text 
    select(option, :from => organizationSelect) 

但它會導致這個錯誤:

Ambiguous match, found 2 elements matching option "Institution" (Capybara::Ambiguous) 

所以,我該怎麼選擇從下拉列表中選擇第一,第二,第三等選項(使用水豚)?

回答

105

如果你看一看the source of the select method,你可以看到什麼,當你傳遞一個from關鍵它基本上是:

find(:select, from, options).find(:option, value, options).select_option 

換句話說,它找到<select>你有興趣,然後在其中找到<option>,然後在<option>節點上調用select_option

你已經完成了前兩件事,我只是重新排列它們。然後,你可以釘在年底select_option方法:

find('#organizationSelect').find(:xpath, 'option[2]').select_option 
+1

非常感謝卡羅爾!真的很感謝幫助! :D – Farooq

+0

或者一個簡單的'click'工作得很好。 – Dingle

+1

想在未來的研究中加入這個參考:https://gist.github.com/zhengjia/428105 – BKSpurgeon

141

出於某種原因,並沒有爲我工作。所以我用了別的東西

select "option_name_here", :from => "organizationSelect" 

爲我工作。

+1

奇怪的是,這並不適用於我,因爲該方法似乎至少需要3個選項。儘管您建議的代碼與水豚指南中的示例代碼相匹配。 – Linus

+1

它不是'form',它是'from'。這裏是[選擇文檔](http://www.rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Actions#select-instance_method) – fontno

+2

也許值得注意的值是名稱,ID,或標籤文字。即「#organizationSelect」不正確,但「organizationSelect」應該起作用。 – MZB

1

它不是一個直接的答案,但你可以(如果你的服務器許可證):

1)創建爲您的組織模型;額外的:這將是更容易填充你的HTML。

2)爲您的模型創建工廠(FactoryGirl)

3)用工廠創建一個列表(create_list);

4)「挑」(樣品)從列表中選擇一個組織:

# Random select 
option = Organization.all.sample 

# Select the FIRST(0) by id 
option = Organization.all[0] 

# Select the SECOND(1) after some restriction 
option = Organization.where(some_attr: some_value)[2] 
option = Organization.where("some_attr OP some_value")[2] #OP is "=", "<", ">", so on... 
+4

如果我必須創建一個模型,使用水豚沒有意義 – user1735921

3

不幸的是,最流行的答案並沒有爲我工作完全。我不得不添加.select_option結束髮言

select("option_name_here", from: "organizationSelect").select_option

的無select_option,沒有選擇正在執行

+0

你怎麼能調用'.select_option',因爲'select'方法返回一個布爾值? – Ruby

2

另一種選擇是加入這樣

def select_option(css_selector, value) 
    find(:css, css_selector).find(:option, value).select_option 
    end 
0

的方法要添加還有另一個答案(因爲顯然有很多方法可以根據你的設置來做) - 我通過選擇字面option元素並點擊它來做到這一點

find(".some-selector-for-dropdown option[value='1234']").select_option 

這不是很漂亮,但它的工作原理:/