Wie teste ich einen Bestätigungsdialog mit Cucumber?

Antworten:

61

In Capybara scheint es leider keine Möglichkeit zu geben. Wenn Sie Ihre Tests jedoch mit dem Selenium-Treiber (und wahrscheinlich anderen Treibern, die JavaScript unterstützen) ausführen, können Sie ihn hacken. Überschreiben Sie die confirmMethode, um immer true zurückzugeben, bevor Sie die Aktion ausführen, die den Bestätigungsdialog aufruft . Auf diese Weise wird der Dialog nie angezeigt und Ihre Tests können fortgesetzt werden, als hätte der Benutzer die Schaltfläche OK gedrückt. Wenn Sie das Gegenteil simulieren möchten, ändern Sie es einfach in false.

page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
Das Ö
quelle
Dies scheint in der folgenden Firefox 4 ... @ derek-ekins-Lösung nicht mehr zu funktionieren. Laut Google scheint sie vorwärtskompatibler zu sein, obwohl ich dies noch nicht bestätigen kann (ich stecke bei Capybara fest) 0.3.9).
Carpeliam
1
Siehe Antwort unten für die Verwendung von "page.driver.browser.switch_to ..."
Thorbjørn Hermansen
133

Der Selentreiber unterstützt dies jetzt

Von Capybara aus würden Sie folgendermaßen darauf zugreifen:

page.driver.browser.switch_to.alert.accept

oder

page.driver.browser.switch_to.alert.dismiss

oder

 page.driver.browser.switch_to.alert.text
Derek Ekins
quelle
2
Für alle anderen, die dies befolgen - bitte beachten Sie, dass Dereks Antwort tatsächlich dort funktioniert, wo ich festgestellt habe, dass der Code in der offiziellen Selenium-Dokumentation nicht funktioniert hat (Gurke / Selen). Beachten Sie das Vorhandensein von page.driver.browserin Dereks Antwort
Peter Nixey
Peter - der Code hier ist speziell auf die Verwendung von Capybara zugeschnitten, während der Code in den Dokumenten für die direkte Verwendung von Selenium-Webdriver bestimmt ist. Ich habe auch dieses Beispiel geschrieben, also hoffe ich, dass es funktioniert!
Derek Ekins
Ahh. Ja, guter Punkt und von mir völlig vermisst. In diesem Fall vielen Dank für beide Beispiele.
Peter Nixey
39

Ich habe diese beiden Webschritte implementiert in /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
Dynamick
quelle
8

Wenn Sie die angezeigte Nachricht speziell testen möchten, finden Sie hier eine besonders hackige Möglichkeit. Ich unterstütze es nicht als schönen Code, aber es erledigt den Job. Sie müssen http://plugins.jquery.com/node/1386/release laden oder es so ändern, dass Cookies nativ ausgeführt werden, wenn Sie jQuery nicht möchten.

Verwenden Sie diese Art von Geschichte:

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

Und diese Schritte

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
Jon Wood
quelle
2
Coole Lösung! Ich drehte es ein wenig um, was sich für mich natürlicher anfühlt: gist.github.com/727614
Mat Schaffer
Und hier ist eine andere Version dieses Codes, die sowohl Warn-
Matthew O'Riordan
3

Aktualisierung für aktuelle Versionen von Capybara. Die meisten Capybara-Treiber unterstützen heute die modale API. Um ein Bestätigungsmodal zu akzeptieren, würden Sie tun

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

Dies kann in Gurke mit so etwas verwendet werden

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

Klicken Sie auf die Schaltfläche "Benannt" und akzeptieren Sie ein Bestätigungsfeld mit einer Textnachricht

Thomas Walpole
quelle
2

Der Capybara-Webkit- Treiber unterstützt dies ebenfalls.

regulieren dies
quelle
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
hainguyen
quelle
1

Prickle bietet einige praktische Methoden für die Arbeit mit Popups in Selen und Webkit

Chris Bloom
quelle
0

Das Wesentliche enthält Schritte zum Testen eines JS-Bestätigungsdialogs in Rails 2 und 3 mit einem beliebigen Capybara-Treiber.

Es ist eine Anpassung einer vorherigen Antwort, benötigt jedoch nicht das jQuery Cookie-Plugin.

Joel Cogen
quelle
0

Versuchte die obigen Antworten ohne Glück. Am Ende hat das bei mir funktioniert:

@browser.alert.ok
Andy Stannard
quelle