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

IAm*_*NaN 6 rspec ruby-on-rails 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>
Run Code Online (Sandbox Code Playgroud)

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

问题是没有明确的方法来点击与capybara的提交按钮,除非我错过了明显的.我希望click('commit')能够做到这一点.

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

IAm*_*NaN 16

最后一个宏是我需要的答案,因为显然水豚没有本土的东西.

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

这包含在spec_helper.rb中

RSpec.configure do |config|
  config.include FormHelpers, :type => :feature
  ...etc...
Run Code Online (Sandbox Code Playgroud)

: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
Run Code Online (Sandbox Code Playgroud)

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


apn*_*ing 10

我经常这样做:

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

它绑定到HTML但是它的语义属性,所以我觉得它很好.其实我从不使用神奇的发现者.

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

集成规范适合您,它肯定会模仿用户,但只需提供适当的指示.