问题
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
回答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;">
回答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()")
回答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.
回答4:
You can do this by pressing enter within the input
find('form input').native.send_keys :enter
回答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
回答6:
Now You should use click_on
click_on 'Sign up'
来源:https://stackoverflow.com/questions/8757477/capybara-submit-a-form-without-button