2014-09-27 83 views
9

我正在关注Michael Hartl的Ruby on Rails教程。当我使用rspec/capybara时,fill_in方法让我感到困惑。我有以下看法代码:fills在Rspec/Capybara中如何工作?

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

这是我的测试代码:

fill_in "Name", with: "Example User" 

看来,标签都需要FILL_IN查找输入字段text_field。如果我要么f.label或更改<%= f.text_field :name %><%= f.text_field :another_name %>,测试会给我ElementNotFound错误。任何人都可以解释fill_in在这里的工作原理吗?输入字段和标签都需要fill_in方法吗?

回答

14

它是statedfill_in查找字段name,id或标签文本。据轨道导游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表达式。但是inputidname性质略有不同,所以你应该一直使用id根据选择来达到相同的结果:

fill_in "user_name", with: 'Example User'

所以,综上所述,不需要label场,但你应仔细注意您的html代码并选择fill_in表达式的适当参数。

+0

这是否意味着,如果我在表达式中使用的标签名,FILL_IN方法会在输入填充后的标签吗? – 2014-09-27 21:24:23

+0

@JoeyHu好吧,不是。在我的回答中查看'html'片段 - 标签的'for'属性与输入的'id'具有相同的值,因此无论页面上的实际位置如何,它们都链接在一起。 – twonegatives 2014-09-29 05:49:36

3

只是添加到发布的双音节。下面介绍一下水豚文档说的​​FILL_IN()方法:

场可以通过它的名字[属性],ID [属性]或标签文本

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中,一些字符不能作为使用ymbol名称,除非整个符号被引用。

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

3

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

如果您使用下划线(:first_name)调用Rails text_field helper,那么DOM会呈现为“First name”以及Capybara需要的东西。不需要一个id属性。

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

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