Capybara - Submit a form without button

19,924

Solution 1

Although it's possible to achieve what you want using capybara, the easier and more practical solution is to put a submit button on the form.

There is no reason to not have a button on the form, it's bad accessibility to not have a form and users that do not have a GUI or are using screen readers will have trouble submitting the form otherwise.

If you don't want the form button to be visible, can I suggest using some CSS to make it hidden:

<input type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;">

Solution 2

All your production code should be testable, so if you add a code that is only used by the test than the test will make no sense...

Try to do this instead:

page.execute_script("$('form#your-form').submit()")

Solution 3

Here's a simple solution that doesn't require capybary-webkit, qt, lmnop or whatever.

Does not require a submit button. People say you need it but whatever.

Just monkeypatch a class or two

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

Then you can do something like

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

It's kinda like jacob's answer on here but for his you have to define that in the middle of the test.

For this solution, you can define this in some file in the /support directory or at the beginning of that one spec, etc. It reduces the clutter in the test.

Solution 4

You can do this by pressing enter within the input

find('form input').native.send_keys :enter

Solution 5

I got this to work in capybara 1.1.2 with:

  form = page.find("form")
  class << form
    def submit!
      Capybara::RackTest::Form.new(driver, native).submit({})
    end
  end
  form.submit!

and it looks like a similar solution is described here: http://minimul.com/submitting-a-form-without-a-button-using-capybara.html

Share:
19,924

Related videos on Youtube

Alessandro De Simone
Author by

Alessandro De Simone

https://alessandro.desi

Updated on June 15, 2022

Comments

  • Alessandro De Simone
    Alessandro De Simone almost 2 years

    I am trying to submit a form without button using just Capybara and Rspec (no Cucumber or Selenium, I know there is already a question about that).

    I've seen there is a gist to add a method to submit a form without button:

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

    https://gist.github.com/989533, but I've not gotten it to work and I left a comment on it:

    I get undefined method `submit_form!' for #Capybara::Node::Element:... actually by "Capybara::RackTest::Node.send :include, SubmitRackTestFormWithoutButton" the method submit_form! is added to the Node (not to the Element), but find return an Element

    Do you have some idea to work out that gist, or some other solution to submit a form without button ?

    Thanks

  • Hauleth
    Hauleth over 12 years
    I think that he is testing something like search form like that above.
  • Alessandro De Simone
    Alessandro De Simone over 12 years
    Thanks Mario, I agree with you, but I didn't design the GUI and for now it's not possible to change it (but I need to write the tests that use it)
  • Mario Visic
    Mario Visic over 12 years
    No problems, just position the button off screen and then it should work :)
  • Adam Waite
    Adam Waite almost 11 years
    or just display: none rather than that positioning and sizing surely?
  • Mario Visic
    Mario Visic almost 11 years
    A screen reader would not announce content that is styled with display: none but it would announce content that is pushed off the page with positioning.
  • siegy22
    siegy22 over 7 years
    How should that work if you don't use a javascript driver? ;)