Michael Hartl的Ruby on Rails教程当我使用rspec/capybara时,fill_in方法让我感到困惑。我有以下视图代码:
<%= f.label :name %>
<%= f.text_field :name %>
这是我的测试代码:
fill_in "Name", with: "Example User"
似乎label和text_field都是fill_in定位输入字段所必需的。如果我删除f.label
或将<%= f.text_field :name %>
更改为<%= f.text_field :another_name %>
,则测试将给予ElementNotFound
错误。有人能解释一下fill_in是如何工作的吗?fill_in
方法是否需要输入字段和标签?
3条答案
按热度按时间35g0bw711#
fill_in
在stated中查找字段name
、id
或标签文本。根据rails guides的ActionView::Helpers::FormHelper部分,您询问的视图代码应转换为以下html代码:正如您所看到的,
label
生成了“Name”文本,这是您在fill_in
表达式中请求的。但是input
字段的id
和name
属性略有不同,因此您应该使用基于id
的选择器来实现相同的结果:fill_in "user_name", with: 'Example User'
因此,总而言之,
label
字段不是必需的,但您应该仔细观察您的html代码并为fill_in
表达式选择适当的参数。rseugnpd2#
只是为了增加什么twonegatives张贴。下面是水豚文档对fill_in()方法的描述:
可以通过字段的名称[属性]、ID [属性]或标签文本找到该字段
http://rubydoc.info/github/jnicklas/capybara/Capybara/Node/Actions:fill_in
当我删除“名称”标签时,我可以使用以下任何一种方法,测试仍然通过:
在ruby中,有些字符不能在符号名中使用,除非整个符号被引用。
Capybara必须从页面中检索所有文本字段(或文本区域),然后获取id和name属性的值(使用Nokogiri之类的东西很容易完成),然后检查其中一个值是否等于fill_in()的第一个参数(在通过to_s()将第一个参数转换为String之后)。
x0fgdtte3#
我在这里提供了我的2美分:水豚找不到形状元素。
如果你用下划线(:first_name)调用Rails的text_field帮助器,DOM将被呈现为“First name”,这就是Capybara所需要的。不需要id属性。
查看:
<%= form.text_field :first_name %>
测试:
fill_in "First name", with: 'Elaine'