【问题标题】:capybara check input type (fill_in vs check vs select)capybara 检查输入类型(fill_in vs check vs select)
【发布时间】:2014-08-29 13:35:30
【问题描述】:

我有一种方法可以用水豚为我填写表格。

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时如何告诉水豚check,当元素是<select>时选择?

这是form_attributes的一些示例:

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

【问题讨论】:

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


    【解决方案1】:

    假设#{model}_#{field} 始终是相同的属性(即id、名称或标签),您可以:

    1. 找到元素
    2. 检查元素以确定其类型
    3. 调用相应的方法输入字段

    以下代码假设#{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 语句。

    【讨论】:

      【解决方案2】:

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

      TL;DR:

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

      【讨论】:

      • 问题是它总是可见但你不能填写复选框或选择文本字段...
      • 啊。我认为正在引发的错误是在 if (语句) elsif (语句)中,而不是在方法的主体中。 @FilipBartuzi,您也可以尝试采取救援方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      相关资源
      最近更新 更多