如何使用Capybara选择下拉选项

时间:2013-11-21 23:28:30

标签: ruby selenium-webdriver capybara

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

9 个答案:

答案 0 :(得分:157)

出于某种原因,它对我不起作用。所以我不得不使用别的东西。

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

为我工作。

答案 1 :(得分:122)

如果您查看the source of the select method,您可以看到传递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

答案 2 :(得分:5)

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

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

答案 3 :(得分:3)

不幸的是,最流行的答案并不完全适用于我。我必须将.select_option添加到语句的末尾

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

没有select_option,没有执行选择

答案 4 :(得分:2)

要添加另一个答案(因为显然有很多方法可以根据您的设置进行) - 我选择了文字option元素并点击它

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

它不是很漂亮,但它有效:/

答案 5 :(得分:2)

2017年没有任何答案适用于我与capybara 2.7。 我得到了“ArgumentError:错误的参数数量(给定2,预期0)”

但是这样做了:

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

答案 6 :(得分: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... 

答案 7 :(得分:0)

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

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://saskatoonwashworld.com/$1 [R=301,L]

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

答案 8 :(得分:0)

在Capybara中,您只能对 xpath

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

和方法点击