CapybaraとRspecだけを使用してボタンなしでフォームを送信しようとしています(CucumberやSeleniumはありません。すでに質問があることはわかっています)。
ボタンなしでフォームを送信するメソッドを追加するための要点があることを確認しました。
module SubmitRackTestFormWithoutButton
def submit_form!
Capybara::RackTest::Form.new(driver, form).submit({})
end
end
Capybara::RackTest::Node.send :include, SubmitRackTestFormWithoutButton
https://Gist.github.com/9895 ですが、動作するようになっていないので、コメントを残しました。
未定義のメソッド `submit_form! 'を取得します#Capybara :: Node :: Element:...の場合、実際には「Capybara :: RackTest :: Node.send:include、SubmitRackTestFormWithoutButton」メソッドsubmit_form! Node(要素ではなく)に追加されますが、要素を返すことがわかります
その要点を理解するためのアイデア、またはボタンなしでフォームを送信するための他の解決策はありますか?
ありがとう
カピバラを使用して目的を達成することは可能ですが、より簡単で実用的な解決策は、フォームに送信ボタンを配置することです。
フォームにボタンがない理由はありません。フォームがないのはアクセシビリティが悪く、GUIを持っていないユーザーやスクリーンリーダーを使用しているユーザーは、フォームを送信するのに問題があります。
フォームボタンを表示したくない場合は、CSSを使用して非表示にすることをお勧めします。
<input type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;">
すべての本番コードはテスト可能である必要があるため、テストでのみ使用されるコードを追加しても、テストは意味がありません...
代わりにこれを試してください:
page.execute_script("$('form#your-form').submit()")
これは、capybaryを必要としない簡単なソリューションです-webkit、qt、lmnopなど。
送信ボタンは必要ありません。人々はあなたがそれを必要としていると言いますが、何でも。
クラスを1つか2つモンキーパッチするだけです
# /spec/support/capybara.rb
class Capybara::Session
def submit(element)
Capybara::RackTest::Form.new(driver, element.native).submit({})
end
end
その後、あなたは次のようなことをすることができます
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
ここでの jacob の答えのようなものですが、彼の場合は、テストの途中でそれを定義する必要があります。
このソリューションでは、これを/ supportディレクトリ内のファイル、またはその1つの仕様の先頭などで定義できます。これにより、テストの煩雑さが軽減されます。
入力内でEnterキーを押すことでこれを行うことができます
find('form input').native.send_keys :enter
私はこれをcapybara1.1.2で動作させるようにしました:
form = page.find("form")
class << form
def submit!
Capybara::RackTest::Form.new(driver, native).submit({})
end
end
form.submit!
同様の解決策がここで説明されているように見えます: http://minimul.com/submitting-a-form-without-a-button-using-capybara.html
今あなたはclick_onを使うべきです
click_on 'Sign up'