web-dev-qa-db-ja.com

カピバラ-ボタンなしでフォームを送信

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(要素ではなく)に追加されますが、要素を返すことがわかります

その要点を理解するためのアイデア、またはボタンなしでフォームを送信するための他の解決策はありますか?

ありがとう

26
Alessandro DS

カピバラを使用して目的を達成することは可能ですが、より簡単で実用的な解決策は、フォームに送信ボタンを配置することです。

フォームにボタンがない理由はありません。フォームがないのはアクセシビリティが悪く、GUIを持っていないユーザーやスクリーンリーダーを使用しているユーザーは、フォームを送信するのに問題があります。

フォームボタンを表示したくない場合は、CSSを使用して非表示にすることをお勧めします。

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

すべての本番コードはテスト可能である必要があるため、テストでのみ使用されるコードを追加しても、テストは意味がありません...

代わりにこれを試してください:

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

これは、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つの仕様の先頭などで定義できます。これにより、テストの煩雑さが軽減されます。

9
Cruz Nunez

入力内でEnterキーを押すことでこれを行うことができます

find('form input').native.send_keys :enter
4
Rob Fox

私はこれを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

3
jacob

今あなたはclick_onを使うべきです

click_on 'Sign up'