ruby-on-rails 如何在Rspec/Capybara中使用fill_in?

nhaq1z21  于 2023-07-01  发布在  Ruby
关注(0)|答案(3)|浏览(126)

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方法是否需要输入字段和标签?

35g0bw71

35g0bw711#

fill_instated中查找字段nameid或标签文本。根据rails guides的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生成了“Name”文本,这是您在fill_in表达式中请求的。但是input字段的idname属性略有不同,因此您应该使用基于id的选择器来实现相同的结果:
fill_in "user_name", with: 'Example User'
因此,总而言之,label字段不是必需的,但您应该仔细观察您的html代码并为fill_in表达式选择适当的参数。

rseugnpd

rseugnpd2#

只是为了增加什么twonegatives张贴。下面是水豚文档对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中,有些字符不能在符号名中使用,除非整个符号被引用。
Capybara必须从页面中检索所有文本字段(或文本区域),然后获取id和name属性的值(使用Nokogiri之类的东西很容易完成),然后检查其中一个值是否等于fill_in()的第一个参数(在通过to_s()将第一个参数转换为String之后)。

x0fgdtte

x0fgdtte3#

我在这里提供了我的2美分:水豚找不到形状元素。
如果你用下划线(:first_name)调用Rails的text_field帮助器,DOM将被呈现为“First name”,这就是Capybara所需要的。不需要id属性。
查看:<%= form.text_field :first_name %>
测试:fill_in "First name", with: 'Elaine'

相关问题