【问题标题】:How does fill_in work in Rspec/Capybara?fill_in 在 Rspec/Capybara 中如何工作?
【发布时间】:2014-11-22 04:54:52
【问题描述】:

我正在关注 Michael Hartl 的 Ruby on Rails 教程。当我使用 rspec/capybara 时,fill_in 方法让我感到困惑。我有以下查看代码:

 <%= f.label :name %>   
 <%= f.text_field :name %>

这是我的测试代码:

 fill_in "Name", with: "Example User"

fill_in 似乎都需要 label 和 text_field 来定位输入字段。如果我取消f.label 或将&lt;%= f.text_field :name %&gt; 更改为&lt;%= f.text_field :another_name %&gt;,测试会给我ElementNotFound 错误。谁能解释一下 fill_in 是如何工作的? fill_in 方法是否需要输入字段和标签?

【问题讨论】:

    标签: ruby-on-rails rspec capybara


    【解决方案1】:

    statedfill_in 查找字段 nameid 或标签文本。根据rails guides的ActionView::Helpers::FormHelper部分,您询问的视图代码应翻译为以下html代码:

    # I assume that you made a form for a @user object
    <label for="user_name">
      Name
    </label>
    <input id="user_name" name="user[name]" type="text" />
    

    如您所见,label 生成了“名称”文本,您在 fill_in 表达式中要求提供该文本。但是input 字段的idname 属性略有不同,所以您应该一直使用基于id 的选择器来达到相同的结果:

    fill_in "user_name", with: 'Example User'

    因此,综上所述,label 字段不是必需的,但您应该仔细观察您的 html 代码并为fill_in 表达式选择适当的参数。

    【讨论】:

    • 这是否意味着如果我在表达式中使用标签名称,fill_in 方法会在标签之后填写输入?
    • @JoeyHu 好吧,不是真的。在我的回答中查看htmlsn-p - 标签的for 属性与输入的id 具有相同的值,因此无论页面上的实际位置如何,它们都链接在一起。
    【解决方案2】:

    只是为了添加两个负面发布的内容。以下是 capybara 文档对 fill_in() 方法的说明:

    可以通过其名称 [attribute]、id [attribute,] 或标签文本找到该字段

    http://rubydoc.info/github/jnicklas/capybara/Capybara/Node/Actions:fill_in

    当我删除“名称”标签时,我可以使用以下任何一种,但测试仍然通过:

     fill_in 'user_name',   with: "Example User"  #locate text field by id attribute
     fill_in :user_name,    with: "Example User"  #locate text field by id attribute
    
     fill_in 'user[name]',  with: "Example User"  #locate text field by name attribute
     fill_in :'user[name]'  with: "Example User"  #locate text field by name attribute
    

    在 ruby​​ 中,某些字符不能在符号名称中使用,除非整个符号被引用。

    Capybara 必须从页面中检索所有文本字段(或文本区域),然后获取 id 和 name 属性的值(使用 Nokogiri 之类的东西很容易完成),然后检查任一值是否等于第一个参数fill_in() (通过 to_s() 将第一个参数转换为字符串之后)。

    【讨论】:

      【解决方案3】:

      我在这里提供了我的 2 美分:Capybara not finding form elements

      如果您使用下划线 (:first_name) 调用 Rails 的 text_field 帮助程序,DOM 将呈现为“名字”以及 Capybara 需要的名称。不需要 id 属性。

      查看: &lt;%= form.text_field :first_name %&gt;

      测试: fill_in "First name", with: 'Elaine'

      【讨论】:

        猜你喜欢
        • 2018-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多