fill_in如何在Rspec / Capybara中运作?

时间:2014-09-27 06:45:46

标签: ruby-on-rails rspec capybara

我正在关注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或将<%= f.text_field :name %>更改为<%= f.text_field :another_name %>,则测试会给我ElementNotFound错误。任何人都可以解释fill_in如何在这里工作? fill_in方法是否需要输入字段和标签?

3 个答案:

答案 0 :(得分:17)

fill_in name查找字段id# 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" /> 或标签文字stated。根据rails guide的ActionView::Helpers::FormHelper部分,您询问的视图代码应转换为以下html代码:

label

如您所见,fill_in制作了&#34;姓名&#34;您在id表达式中要求的文本。但name字段的inputid属性略有不同,因此您应该使用基于fill_in "user_name", with: 'Example User'的选择器来获得相同的结果:

label

因此,总而言之,fill_in字段不是必需的,但您应该仔细观察您的html代码并为{{1}}表达式选择适当的参数。

答案 1 :(得分:5)

只是添加了什么twonegatives张贴。这是capybara docs对fill_in()方法所说的内容:

  

可以通过名称[attribute],id [attribute,]或标签文本

找到该字段

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

当我删除&#39;姓名&#39;标签,我可以使用以下任何一种,测试仍然通过:

 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()将第一个参数转换为String之后。)

答案 2 :(得分:3)

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

如果使用下划线(:first_name)调用Rails text_field助手,则DOM将呈现为&#34;名字&#34;以及它的Capybara需要什么。不需要id属性。

查看: <%= form.text_field :first_name %>

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