23

Cucumber、capybara、selenium ドライバーを使用したテストがあります。このテストは、フォームに移動して送信する必要があります。通常のテキストは

  Scenario: Fill form
    Given I am on the Form page
    When I fill in "field1" with "value1"
    And I fill in "field2" with "value2"
    And I press "OK"
    Then I should see "Form submited"

問題は、フォームに [OK] ボタンがないことです 。ボタンやリンクをクリックせずに「form.submit」を実行する方法が必要です。フォーム フィールドにいるときに Enter キーを押した場合と同じです。ブラウザを使用します。

カピバラにフォームを送信するように指示する方法がわかりません。どうすればいいですか?

4

12 に答える 12

31

Selenium send_keysメソッドにアクセスして、次のようなリターン イベントを呼び出すことができます。

 find_field('field2').native.send_key(:enter)
于 2011-03-29T20:08:27.680 に答える
19

簡単な解決策:

When /^I submit the form$/ do
  page.evaluate_script("document.forms[0].submit()")
end

capybara-envjs で私のために働いた。セレンでも動作するはずです。

于 2010-06-27T01:22:54.550 に答える
10

この問題を自分で解決するしかありませんでした。webrat では、次のようなものがありました。

Then /^I submit the "([^\"]*)" form$/ do |form_id|
  submit_form form_id
end

私はカピバラでこれと同じことを達成することができました:

  Then /^I submit the "([^\"]*)" form$/ do |form_id|
    element = find_by_id(form_id)
    Capybara::RackTest::Form.new(page.driver, element.native).submit :name => nil
  end
于 2011-06-25T20:23:27.930 に答える
5

カピバラ Selenium ドライバーを使用すると、次のようなことができます。

within(:xpath, "//form[@id='the_form']") do
  locate(:xpath, "//input[@name='the_input']").set(value)
  locate(:xpath, "//input[@name='the_input']").node.send_keys(:return)
end
于 2010-10-19T22:38:03.770 に答える
3

簡単に言えば、できません。

一部のブラウザーでは、送信ボタンがないとフォームを送信できません (特に Internet Explorer <= 6)。したがって、この種のフォームは最初から悪い考えです。送信ボタンを追加し、CSS で画面外に配置します。

于 2010-05-09T15:27:09.047 に答える
1

改行を送信してみてください。

find_field('field2').native.send_key("\n")
于 2013-02-11T07:47:29.690 に答える
1

display:none ソリューションは、selenium ドライバーを使用するカピバラでは機能しません。これは、selenium が目に見えない要素との相互作用について不平を言うためです。上記の解決策を試すと、次のエラー メッセージが表示される場合があります。

Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotVisibleError)
于 2012-02-09T18:41:33.800 に答える
1

Webrat を使用すると、次のことができます。

When /^I submit the form$/ do
  submit_form "form_id"
end

p。307、RSpecブック

于 2011-02-26T02:28:21.367 に答える
1

送信ボタンを追加して、CSS で非表示にすることをお勧めします。その後、フォームの送信をテストできますが、必要なユーザーの動作を取得できます。

于 2010-10-18T17:22:20.640 に答える
1

おそらく、独自の手順を実行して (たとえば、「OK」というリンクを含むフォームを送信します)、送信機能を自分でエミュレートすることもできます。

これは、Rails 3 で「目立たない」(引用符を強調する) Javascript をサポートするために削除された JavaScript エミュレーションです。この線

Capybara::Driver::RackTest::Form.new(driver, js_form(self[:href], emulated_method)).submit(self)

おそらくあなたの問題に答える手がかりです。完全なコードはこちら

于 2010-05-11T04:49:35.347 に答える
0

これを試して..

find(:css, "input[name$='login']").native.send_keys :enter
于 2014-08-25T07:24:56.547 に答える
0

これは少しハックですが、ニーズを満たしました。#submit要素のメソッドをサポートするために、Capybara にモンキー パッチを適用しました。

nameすべての入力要素とvalue属性から単純に POST パラメータを作成するため、堅牢ではありません。(私の場合、私の<input>要素はすべて typehiddenだったので、正常に動作します)。

class Capybara::Node::Element
  # If self is a form element, submit the form by building a
  # parameters from all 'input' tags within this form.
  def submit
    raise "Can only submit form, not #{tag_name}" unless tag_name =~ /form/i

    method = self['method'].to_sym
    url = self['action']
    params = all(:css, 'input').reduce({}) do |acc, input|
      acc.store(input['name'], input['value'])
      acc
    end

    session.driver.submit(method, url, params)
  end
end

...

form = find('#my_form_with_no_submit_button')
form.submit
于 2011-11-03T17:33:49.237 に答える