fill_in如何在Rspec / Capybara中运作?
我正在关注Michael Hartl的Ruby on Rails教程。 当我使用rspec / capybara时,fill_in方法让我感到困惑。 我有以下视图代码:
这是我的测试代码:
fill_in "Name", with: "Example User"
看来,fill_in需要label和text_field才能找到输入字段。 如果我取消f.label
或将更改为
,测试将给出
ElementNotFound
错误。 任何人都可以解释fill_in如何在这里工作? fill_in
方法是否都需要输入字段和标签?
据说fill_in
查找字段name
, id
或标签文本。 根据rails指南的ActionView :: Helpers :: FormHelper部分,您询问的视图代码应转换为以下html代码:
# I assume that you made a form for a @user object
如您所见, label
生成了“Name”文本,您在fill_in
表达式中要求它。 但是input
字段的id
和name
属性略有不同,所以你应该使用基于id
的选择器来实现相同的结果:
fill_in "user_name", with: 'Example User'
因此,总而言之, label
字段不是必需的,但您应该仔细观察您的html代码并为fill_in
表达式选择适当的参数。
只是为了添加什么twonegatives张贴。 以下是capybara文档对fill_in()方法的说法:
可以通过名称[attribute],id [attribute,]或标签文本找到该字段
http://rubydoc.info/github/jnicklas/capybara/Capybara/Node/Actions:fill_in
当我删除’Name’标签时,我可以使用以下任何一种,测试仍然通过:
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美分: Capybara没有找到表格元素 。
如果使用下划线(:first_name)调用Rails text_field助手,则DOM将呈现为“名字”及其所需的Capybara。 不需要id属性。
查看: <%= form.text_field :first_name %>
测试: fill_in "First name", with: 'Elaine'