Capybara - 提交没有按钮的表格

Ale*_* DS 26 testing bdd rspec ruby-on-rails capybara

我试图提交一个没有按钮的表单只使用Capybara和Rspec(没有Cucumber或Selenium,我知道已经存在一个问题).

我已经看到有一个要点是添加一个方法来提交没有按钮的表单:

module SubmitRackTestFormWithoutButton
  def submit_form!
    Capybara::RackTest::Form.new(driver, form).submit({})
  end
end
Capybara::RackTest::Node.send :include, SubmitRackTestFormWithoutButton
Run Code Online (Sandbox Code Playgroud)

https://gist.github.com/989533,但我没有让它工作,我对它发表了评论:

我得到未定义的方法`submit_form!' for #Capybara :: Node :: Element:...实际上是通过"Capybara :: RackTest :: Node.send:include,SubmitRackTestFormWithoutButton"方法submit_form!添加到节点(而不是元素),但找到返回元素

您是否有一些想法可以解决这个问题,或者其他一些解决方案来提交没有按钮的表单?

谢谢

小智 24

你的所有生产代码都应该是可测试的,所以如果你添加一个仅供测试使用的代码而不是测试就没有意义......

尝试这样做:

page.execute_script("$('form#your-form').submit()")
Run Code Online (Sandbox Code Playgroud)

  • 如果您不使用JavaScript驱动程序,该怎么办?;) (2认同)

Cru*_*nez 9

这是一个简单的解决方案,不需要capybary-webkit,qt,lmnop等等.

不需要提交按钮.人们说你需要它,但无论如何.

只是monkeypatch一两个类

# /spec/support/capybara.rb
  class Capybara::Session
    def submit(element)
      Capybara::RackTest::Form.new(driver, element.native).submit({})
    end
  end
Run Code Online (Sandbox Code Playgroud)

然后你可以做类似的事情

require 'support/capybara'

before do
  create :lead
  create :user, :different_email
end

it 'Searchable' do
  visit users_path
  page.should have_content 'Slicer'
  page.should have_content 'Dicer'

  fill_in 'Search', with: 'dice'

  form = find '#search-form' # find the form
  page.submit form           # use the new .submit method, pass form as the argument

  page.should have_content 'Dicer'
  page.should_not have_content 'Slicer'
end
Run Code Online (Sandbox Code Playgroud)

这有点像雅各布在这里的答案,但对于他来说,你必须在测试中定义它.

对于此解决方案,您可以在/ support目录中的某个文件中或在该规范的开头等处定义此项.它可以减少测试中的混乱.


Rob*_*Fox 6

您可以通过在输入中按 Enter 来执行此操作

find('form input').native.send_keys :enter
Run Code Online (Sandbox Code Playgroud)


Mar*_*sic 0

虽然使用水豚可以实现您想要的效果,但更简单、更实用的解决方案是在表单上放置一个提交按钮。

表单上没有理由没有按钮,没有表单的可访问性很差,没有 GUI 或使用屏幕阅读器的用户将无法提交表单。

如果您不希望表单按钮可见,我可以建议使用一些 CSS 将其隐藏:

<input type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;">
Run Code Online (Sandbox Code Playgroud)

  • 屏幕阅读器不会宣布使用 display: none 样式的内容,但它会宣布通过定位从页面推出的内容。 (3认同)
  • 或者只是“显示:无”而不是定位和大小确定? (2认同)