2013-11-21 50 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 

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