【问题标题】:Check select box has certain options with Capybara检查选择框与 Capybara 有某些选项
【发布时间】:2011-07-20 16:04:43
【问题描述】:

如何使用 Capybara 检查选择框是否将某些值列为选项? 它必须与 Selenium 兼容...

这是我拥有的 HTML:

<select id="cars"> 
  <option></option>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>

这就是我想做的:

Then the "cars" field should contain the option "audi"

【问题讨论】:

  • 如果您可以为相关部分发布您的 HTML/ERB,将会很有帮助。

标签: ruby-on-rails selenium cucumber capybara


【解决方案1】:

尝试改用 capybara rspec 匹配器have_select(locator, options = {})

#Find a select box by (label) name or id and assert the given text is selected
Then /^"([^"]*)" should be selected for "([^"]*)"$/ do |selected_text, dropdown|
  expect(page).to have_select(dropdown, :selected => selected_text)
end

#Find a select box by (label) name or id and assert the expected option is present
Then /^"([^"]*)" should contain "([^"]*)"$/ do |dropdown, text|
  expect(page).to have_select(dropdown, :options => [text])
end

【讨论】:

  • 对于 RSpec 用户,我使用了page.should have_select('Something', :options =&gt; ['plain text'])
  • @hubble 你的评论绝对应该有自己的回应:)
  • 您也可以使用with_options 来检查特定选项是否存在,而无需指定所有顺序
  • Capybara 似乎暗示 options 是一个完整的集合,而 with_options 允许所有选项的子集,便于检查特定选项是否在选择中而不指定所有选项选项。仍在寻找指定顺序的东西。 github.com/jnicklas/capybara/blob/master/lib/capybara/node/…
  • 较新的 RSpec 语法:expect(page).to have_select(...)
【解决方案2】:

对于它的价值,我将其称为下拉菜单,而不是字段,所以我会写:

Then the "cars" drop-down should contain the option "audi"

为了回答你的问题,这里是实现这个的 RSpec 代码(未经测试):

Then /^the "([^"]*)" drop-down should contain the option "([^"]*)"$/ do |id, value|
  page.should have_xpath "//select[@id = '#{id}']/option[@value = '#{value}']"
end

如果您想测试选项文本而不是 value 属性(这可能适用于more readable 场景),您可以编写:

  page.should have_xpath "//select[@id = '#{id}']/option[text() = '#{value}']"

【讨论】:

  • Options 应该是 option.. 嗯,我正在用这个 page.should have_css('select option:contains('Audi')', :visible => true)。为什么?代码更具可读性,并检查元素是否可见...
  • @Tom:contains 伪类是 taken out of the CSS spec,所以我不确定这是否适用于任何地方,但除此之外,CSS 也一样好(我同意更具可读性)。顺便说一句,您可以在either method 上使用 :visible。重新学习 XPath,我只使用了 examples in the spec(和 these as well)。
  • 哦,现在还没有……可惜他们放弃了 'contains()',它看起来很有用。我会看一下 XPath 示例,谢谢!
  • 用我的 rspec/capybara page.should.have_xpath 不起作用,但 page.should have_xpath 可以。
【解决方案3】:

作为替代解决方案,由于我不熟悉 xpath,我这样做是为了解决类似的问题:

page.all('select#cars option').map(&:value).should == %w(volvo saab mercedes audi)

这很简单,但我花了一些时间才弄清楚。

【讨论】:

    【解决方案4】:

    好吧,既然我在附近并且看到了这个问题(并且今天一直在测试)决定发布我的方式:

    within("select#cars") do
      %w(volvo saab mercedes audi).each do |option|
        expect(find("option[value=#{option}]").text).to eq(option.capitalize)
      end
    end
    

    【讨论】:

      【解决方案5】:
      Then I should see "audi" within "#cars"
      

      应该做的伎俩

      【讨论】:

      • 谢谢,但它不起作用。在黄瓜中,“汽车”将是一个“领域”,而“内部”则意味着一个范围。因此,一个接近的标准步骤是“那么“汽车”字段应该包含“奥迪”。但如果没有选择,它会返回一个空字符串:预期:/Audi/,得到:“”
      • 当汽车显然是一个选择标签时,它怎么能成为一个字段?您正在检查您的汽车下拉菜单中是否存在奥迪选项?还是您正在检查它是否是选定的选项?
      猜你喜欢
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多