Rails + Capybara:“has_select(...,options:...)失败,即使select存在?

时间:2014-05-22 18:24:45

标签: ruby-on-rails

我使用的是Rails 4,Cucumber,Capybara。对于这种特殊情况,我使用的是@javascript标记,它使用Selenium驱动程序。

在我的测试中,我正在测试使用jQuery + ajax的select下拉列表。以下是步骤:用户进入表单页面,然后单击下拉列表以展开它,然后单击"创建新颜色..."选项。选择该选项后,将显示一个文本字段,该人员可以键入颜色名称。当他们按Enter键时,将创建该颜色并重新加载选择下拉列表以在选项中包含该新颜色。

步骤定义:

When(/^I create a new color named "(.*?)"$/) do |color_name|
  find("option[id='new_color_option']").click
  fill_in("color[name]", with: color_name)
  find(:id, 'new_color_text_field').native.send_keys(:enter)
end

Then(/^"(.*?)" should be on the color list$/) do |color_name|
  expect(page).to have_select("color", options: [color_name])
end

它失败了:

Then "Blue" should be on the color list       # features/step_definitions/cms/products_steps.rb:175
  expected to find select box "color" but there were no matches. Also found "Blue Create a new color...", which matched the selector but not all filters. (Capybara::ExpectationNotMet)
  ./features/step_definitions/cms/products_steps.rb:177:in `/^"(.*?)" should be on the color list$/'
  features/cms/products.feature:53:in `Then "Blue" should be on the color list'

问题在于它未能找到我的选择下拉列表。我正盯着驱动程序打开浏览器,甚至在中间添加了sleep 20,以便我可以检查HTML。

在添加颜色之前:

    <select class="colors" name="color">

        <option id="new_color_option" value="">

            Create a new color...

        </option>

    </select>

添加颜色后:

    <select class="colors" name="color">

        <option value="1" selected="selected">

            Blue

        </option>
        <option id="new_color_option" value="">

            Create a new color...

        </option>

    </select>

为什么它无法找到我的选择下拉列表?

2 个答案:

答案 0 :(得分:11)

您需要更改

expect(page).to have_select("color", options: [color_name])

使用with_options代替options

expect(page).to have_select("color", with_options: [color_name])

optionswith_options部分匹配的所有选项完全匹配。

答案 1 :(得分:1)

has_select?方法正在寻找<select/>完全您指定的选项。试试这个:

expect(page).to have_select("color", options: [color_name, "Create a new color..."])

错误消息which matched the selector but not all filters是一个线索,因为它找到了元素,但过滤器(在这种情况下为options)不匹配。