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查找字段nameid或标签文本。 根据rails指南的ActionView :: Helpers :: FormHelper部分,您询问的视图代码应转换为以下html代码:

 # I assume that you made a form for a @user object   

如您所见, label生成了“Name”文本,您在fill_in表达式中要求它。 但是input字段的idname属性略有不同,所以你应该使用基于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'