質問

キュウリ、カピバラ、セレンドライバーを使用したテストを受けています。このテストはフォームに移動して送信する必要があります。通常のテキストはそうでしょう

  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を押すときと同じです。

フォームを提出するようにカピバラに伝える方法がわかりません。どうすればできますか?

役に立ちましたか?

解決

セレンにアクセスできます send_keys のようなリターンイベントを呼び出す方法

 find_field('field2').native.send_key(:enter)

他のヒント

簡単な解決策:

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

Capybara-envjsで私のために働いた。 Seleniumも操作する必要があります。

私は自分でこの問題を解決しなければなりませんでした。ウェブラットで私はこのようなものを持っていました:

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

Capybara 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

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

一部のブラウザでは、送信ボタンなしでフォームを送信することはできません(特にインターネットエクスプローラー<= 6)。したがって、この種のフォームは、そもそも悪い考えです。送信ボタンを追加し、CSSで画面から外します。

おそらく、独自のステップをロールし(たとえば、リンク「OK」というフォームを送信して、送信機能を自分でエミュレートすることができます。

ここでは、「控えめな」(引用符を強調する)JavaScriptをサポートするために、Rails 3でドロップされたJavaScriptエミュレーションがあります。この線

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

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

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

ウェブラットを使用すると、次のことができます。

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

p。 307、RSPECブック

ディスプレイ:セレニウムドライバーを使用してCapybaraを使用しないソリューションはありません。Seleniumは目に見えない要素との相互作用について不満を述べているためです。上記のソリューションを試してみると、次のエラーメッセージが表示される可能性があります。

Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotVisibleError)

新しいラインを送信することができます:

find_field('field2').native.send_key("\n")

これは少しハッキッシュですが、ニーズを満たしました。私はaをサポートするためにカピバラをモンキーパッチしました #submit 要素の方法。

すべての入力要素からpostパラメーターを素朴に作成するため、堅牢ではありません namevalue 属性。 (私の場合、私のすべて <input> 要素はタイプでした hidden, 、それが正常に動作する)。

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

これを試して..

find(:css, "input[name$='login']").native.send_keys :enter
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top