Cucumberで確認ダイアログをテストする方法は?


86

私はRubyonRailsをCucumberとCapybaraで使用しています。

簡単な確認コマンド(「よろしいですか?」)をテストするにはどうすればよいですか?

また、この問題に関する詳細なドキュメントはどこにありますか?


Capybara-webkitを使用している場合は、そこに答えがあります:stackoverflow.com/questions/6930927/…–
Adrien

回答:


62

残念ながら、カピバラではそれを行う方法がないようです。ただし、Seleniumドライバー(およびおそらくJavaScriptをサポートする他のドライバー)を使用してテストを実行している場合は、ハッキングすることができます。確認ダイアログを表示するアクションを実行する直前に、confirmメソッドをオーバーライドして常にtrueを返します。そうすれば、ダイアログが表示されることはなく、ユーザーが[OK]ボタンを押したかのようにテストを続行できます。逆をシミュレートする場合は、falseを返すように変更するだけです。

page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')

これはFirefox4ではもう機能しないようです...以下の@ derek-ekinsソリューションは、Googleが私に言っていることから、まだ確認できませんが、より上位互換性があるようです(私はカピバラで立ち往生しています) 0.3.9)。
carpeliam 2011

1
使用については、以下の回答を参照してください「page.driver.browser.switch_toを...」
するThorbjörnHermansenの

134

セレンドライバーがこれをサポートするようになりました

カピバラからは、次のようにアクセスします。

page.driver.browser.switch_to.alert.accept

または

page.driver.browser.switch_to.alert.dismiss

または

 page.driver.browser.switch_to.alert.text

2
これをフォローしている他の人にとっては、Seleniumの公式ドキュメント(キュウリ/ Selenium)のコードが機能しないことがわかった場合、Derekの回答は実際に機能することに注意してください。page.driver.browserデレクの答えに存在することに注意してください
ピーターニクシー2011

Peter-ここのコードはcapybaraを使用するために特別に調整されていますが、ドキュメントのコードはselenium-webdriverを直接使用している場合のものです-私もその例を書いたので、うまくいくことを願っています!
Derek Ekins 2011

ああ。はい、良い点であり、私には完全に見落とされました。その場合、両方の例に感謝します。
Peter Nixey 2011

39

私はこれらの2つのWebステップを/features/step_definitions/web_steps.rb以下に実装しました:

When /^I confirm popup$/ do
  page.driver.browser.switch_to.alert.accept    
end

When /^I dismiss popup$/ do
  page.driver.browser.switch_to.alert.dismiss
end

8

表示されているメッセージを具体的にテストしたい場合は、特にハッキーな方法があります。私はそれを美しいコードとして推奨していませんが、それは仕事を成し遂げます。http://plugins.jquery.com/node/1386/releaseをロードするか、jQueryが必要ない場合は、Cookieをネイティブに実行するように変更する必要があります。

この種のストーリーを使用してください:

Given I am on the menu page for the current booking
And a confirmation box saying "The menu is £3.50 over budget. Click Ok to confirm anyway, or Cancel if you want to make changes." should pop up
And I want to click "Ok"
When I press "Confirm menu"
Then the confirmation box should have been displayed

そして、これらのステップ

Given /^a confirmation box saying "([^"]*)" should pop up$/ do |message|
  @expected_message = message
end

Given /^I want to click "([^"]*)"$/ do |option|
  retval = (option == "Ok") ? "true" : "false"

  page.evaluate_script("window.confirm = function (msg) {
    $.cookie('confirm_message', msg)
    return #{retval}
  }")
end

Then /^the confirmation box should have been displayed$/ do
  page.evaluate_script("$.cookie('confirm_message')").should_not be_nil
  page.evaluate_script("$.cookie('confirm_message')").should eq(@expected_message)
  page.evaluate_script("$.cookie('confirm_message', null)")
end

2
クールな解決策!私はそれを少しひっくり返しましたが、それは私にとってより自然に感じます:gist.github.com/727614
Mat Schaffer

そして、アラートボックスと確認ボックスの両方をサポートするそのコードの別のバージョン、gist.github.com / 919116
Matthew O'Riordan

3

カピバラの現在のリリースのためにこれを更新します。今日のほとんどのCapybaraドライバーは、モーダルAPIをサポートしています。確認モーダルを受け入れるには、

accept_confirm do  # dismiss_confirm if not accepting
  click_link 'delete'  # whatever action triggers the modal to appear
end

これはキュウリで次のようなもので使用できます

When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
  accept_confirm msg do
    click_button(button)
  end
end

名前の付いたボタンをクリックし、メッセージに一致するテキストを含む確認ボックスを受け入れます



2
Scenario: Illustrate an example has dialog confirm with text
    #     
    When I confirm the browser dialog with tile "Are you sure?"
    #
=====================================================================
my step definition here:

And(/^I confirm the browser dialog with title "([^"]*)"$/) do |title|
  if page.driver.class == Capybara::Selenium::Driver
    page.driver.browser.switch_to.alert.text.should eq(title)
    page.driver.browser.switch_to.alert.accept
  elsif page.driver.class == Capybara::Webkit::Driver
    sleep 1 # prevent test from failing by waiting for popup
    page.driver.browser.confirm_messages.should eq(title)
    page.driver.browser.accept_js_confirms
  else
   raise "Unsupported driver"
 end
end


0

この要点には、Rails2および3のJS確認ダイアログをCapybaraドライバーでテストする手順があります。

これは前の回答を応用したものですが、jQueryCookieプラグインは必要ありません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.