如何单击Capybara中的表单提交按钮

时间:2014-03-12 21:19:21

标签: ruby-on-rails rspec capybara

使用Rails,rspec和capybara,我正在尝试测试典型的ERB生成形式:

<form action="/pages/1" id="edit_page_1" method="post">
  <input id="page_title" name="page[title]" type="text">
  <input name="commit" type="submit" value="Update Page">
</form>

我运行两种功能规格,无论语言是什么,以及I18N特定的功能(用于国际化测试)。

问题是没有明确的方法来点击与capybara的提交按钮,除非我错过了明显的。我希望只需click('commit')即可。

  • 使用click_button('Update Page')有效,但显然是特定于语言的,即使它们呈现相同的表单模板,也无法与新模板和编辑模板一起使用。
  • 在提交按钮中添加ID有效,但我非常不喜欢专门更改代码,因为测试需要它。
  • 使用css或xml匹配器看起来都很丑陋(用户永远不会知道/关心以这种方式访问​​元素)并且它太过分了。

3 个答案:

答案 0 :(得分:16)

最后一个宏是我需要的答案,因为显然水豚没有任何原生。

# spec/support/form_helpers.rb
module FormHelpers
  def submit_form
    find('input[name="commit"]').click
  end
end

这包含在spec_helper.rb

RSpec.configure do |config|
  config.include FormHelpers, :type => :feature
  ...etc...

我使用:type => :feature因此它只包含在集成测试中。

在集成测试中,您可以像这样使用它:

scenario 'pages can be created' do
  visit new_page_path
  fill_in 'page_title', with: 'A Tale of Two Cities'
  submit_form # Clicks the commit button regardless of id or text

  expect(page).to have_content 'The page was created'
  ...etc..
end

当然submit_form也可以在within块内和:js => true内使用。

答案 1 :(得分:10)

我通常会这样做:

within 'form#edit_page_1' do
  find('input[name="page[title]"]').set "Some Value" 
  find('input[name="commit"]').click
end

它与html绑定,但与其语义属性相关,所以我觉得它很好。 实际上我从不使用神奇的发现者。

顺便说一下,我不明白你的评论:(a user would never know/care about accessing an element that way)

集成规格适合您,它可以模仿用户,但只需提供正确的指示。

答案 2 :(得分:1)

尝试使用:

find('input[name="commit"]').click

有帮助