キュウリ、カピバラ、セレン - ボタンなしでフォームを提出する
質問
キュウリ、カピバラ、セレンドライバーを使用したテストを受けています。このテストはフォームに移動して送信する必要があります。通常のテキストはそうでしょう
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パラメーターを素朴に作成するため、堅牢ではありません name
と value
属性。 (私の場合、私のすべて <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