如何选择下拉选项使用水豚

我试图选择一个项目从下拉菜单使用水豚(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) ?

120543 次浏览

如果你看一下 select方法的来源,你可以看到当你传递一个 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

因为某些原因,这对我不起作用,所以我不得不用别的东西。

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

对我有用。

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

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...

不幸的是,最流行的答案并不完全适合我。我不得不在语句的结尾添加 .select_option

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

如果没有 select_option,则不执行任何选择

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

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

为了给这一堆添加另一个答案(因为显然有很多方法可以根据你的设置来做这件事) ,我选择了字面的 option元素并点击它

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

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

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

但这个确实做到了:

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

下面是我发现的最简洁的方法(使用 capybara 3.3.0和 chrome 驱动程序) :

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

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

在水豚你只能使用 找到Xpath

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

方法 点击

我用的是 simple _ form:

与协会合作时:

= f.association :company, collection: Company.ordered, as: :select, include_blank: false
# output HTML
<select class="form__input" name="role[company_id]" id="role_company_id">
<option value="1">APPLE</option>
<option value="5">J.P. MORGAN</option>
<option value="6">JOHNSON &amp; JOHNSON</option>
<option value="4">KPMG</option>
<option value="2">MICROSOFT</option>
<option value="3">WALMART</option>
</select>

这招对我很管用:

find('#role_company_id').find(:xpath, 'option[3]').select_option

使用常规选择时:

= f.input :work_type, as: :select, collection: Role.work_types.collect { |key, value| [key.to_s.titleize, value] }, include_blank: false
# output HTML
<select class="form__input" name="role[work_type]" id="role_work_type">
<option selected="selected" value="in_person">In Person</option>
<option value="remote">Remote</option>
<option value="hybrid">Hybrid</option>
</select>

这招对我很管用:

find_by_id("role_work_type").find("option[value='remote']").click

希望这个能帮上忙。