我正在关注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
方法是否需要输入字段和标签?
答案 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
字段的input
和id
属性略有不同,因此您应该使用基于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'