水豚检查输入类型(fill_in vs check vs select)

时间:2014-08-29 13:35:30

标签: ruby-on-rails ruby-on-rails-4 rspec cucumber capybara

我有方法用水豚为我填写表格。

FactoryGirl获取一些默认参数后,我循环播放:

form_attributes.each do |field, value|
    if value == false
      value == true ? check("#{model}_#{field}") : uncheck("#{model}_#{field}")
    elsif try(:select,value, from: "#{model}_#{field}")
      select value, from: "#{model}_#{field}"
    elsif try(:fill_in, "#{model}_#{field}", with: value)
      fill_in "#{model}_#{field}", with: value
    else
      raise Capybara::ElementNotFound
    end
end

不幸的是try(:select,value, from: "#{model}_#{field}")会引发错误Capybara::ElementNotFound: Unable to find select box ...

如何在元素为checkbot时将capybara告诉check并在元素为<select>时选择?

以下是form_attributes的一些示例:

{:attitude=>"happy",
 :feedback_date=>2014-08-19 15:35:14 +0200,
 :feedback_action=>"Refund",
 :feedback_details=>"....",
 :approved=>"true"}

2 个答案:

答案 0 :(得分:1)

假设#{model}_#{field}始终是相同的属性(即id,name或label),您可以:

  1. 找到元素
  2. 检查元素以确定其类型
  3. 调用适当的方法输入字段
  4. 以下代码假定#{model}_#{field}是元素的id:

    form_attributes.each do |field, value|
      e = find("##{model}_#{field}")
      if e.tag_name == 'select'
        e.select(value)
      elsif e.tag_name == 'input' && e['type'] == 'checkbox'
        # Assumes that value is true or false (not a String)
        e.set(value)
      else
        # Assumes e is a text field
        e.set(value)
      end
    end
    

    在此代码中,我们检查元素的tag_name和type属性(如果需要)。由于输入标记可以是文本字段的方式有很多种,因此假定任何不是选择列表或复选框的内容都必须是文本字段。如果你还想处理单选按钮等,你需要扩展if-else语句。

答案 1 :(得分:0)

我建议你在elsif中使用has_selector?方法。它返回一个布尔值,指示它是否在页面中可见。这是a link页面的文档。

TL; DR:

page.has_selector?('p#foo')
page.has_selector?('li', :text => 'Horse', :visible => true)