如何使用水豚下拉菜单中选择选项


125

我正在尝试使用Capybara(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)

那么,如何从下拉列表中选择第一个,第二个,第三个等选项(使用Capybara)?

Answers:


129

如果您看一下select方法的源代码,您会发现当您传递一个from键时,它的本质是:

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

换句话说,它找到<select>您感兴趣的对象,然后找到<option>其中的对象,然后调用select_option<option>节点。

您已经完成了前两件事,我只是重新排列了一下。然后,您可以select_option在最后添加方法:

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

1
非常感谢Carol!非常感谢您的帮助!:D
Farooq,2013年

2
希望为将来进行研究的人员添加此参考:gist.github.com/zhengjia/428105
BKSpurgeon 16-4-24

3
好答案!我想补充一点,在Rails 5中,您也可以通过以下方式进行操作:select('option_name', from: 'select_box')。值可以是:id,名称,相关标签元素。您可以在此处阅读有关Capybara和DSL选项的更多信息。
Nesha Zoric '18

177

由于某种原因,它对我不起作用。所以我不得不使用其他东西。

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

为我工作。


1
很奇怪,这对我不起作用,因为该方法似乎至少需要3个选项。尽管您建议的代码与水豚指南中的示例代码匹配。
莱纳斯(Linus)2014年

1
不是form,是from。这是精选文档
fontno 2014年

3
可能值得注意的from值是名称,id或标签文本。即“ #organizationSelect”不正确,但是“ organizationSelect”应该起作用。
MZB

这对我不起作用,但是carols10cents的解决方案起作用了。这不是您的答案的批评者。我只是觉得很奇怪,即使在最新版本的水豚上,即使直觉会导致您认为多种解决方案看起来都是有效的,有些调用仍然有效,有些调用却没有。它让我发疯。这是否与Firefox有关(或最终使用的任何浏览器水豚)?
chaostheory

我认为这仅在选项名称和选项值相同时才有效。
pixelearth

8

另一个选择是添加这样的方法

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

有用的选项find("select[name='organization_search[role]']").find(:option, text: :Staff).select_option
Pixelearth

find(:css, "#search_field").find(:option, "Opp Last Name").select_option,这是显示的选项文本,对我有用,而选项的值却没有。
codenoob

4

不幸的是,最流行的答案并不完全适合我。我必须.select_option在声明的末尾加上

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

没有select_option,则没有执行选择


.select_option由于该select方法返回的是布尔值,您怎么能调用?
Ruby

4

为了给堆添加另一个答案(因为显然有很多方法可以完成此操作,具体取决于您的设置)-我是通过选择文字option元素并单击来完成的

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

它不是很漂亮,但是可以工作:/


2

在2017年的水豚2.7中,没有一个答案对我有用。我收到“ ArgumentError:参数数量错误(给定2,预期为0)”

但这确实是:

find('#organizationSelect').all(:css, 'option').find { |o| o.value == 'option_name_here' }.select_option

0

这不是直接的答案,但是您可以(如果服务器允许):

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 2015年

这根本不是答案。这是关于水豚的问题。
罗宾·多尔蒂

0

这是我找到的最简洁的方法(使用水豚3.3.0和铬驱动器):

all('#id-of-select option')[1].select_option

将选择第二个选项。根据需要增加索引。


0

在Capybara中,您只能将findxpath一起使用

find(:xpath, "//*[@id='organizationSelect']/option[2]").click

和方法点击

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.