Ich benutze Ruby on Rails mit Gurke und Capybara.
Wie würde ich einen einfachen Bestätigungsbefehl testen ("Sind Sie sicher?")?
Wo finde ich weitere Dokumentation zu diesem Thema?
Ich benutze Ruby on Rails mit Gurke und Capybara.
Wie würde ich einen einfachen Bestätigungsbefehl testen ("Sind Sie sicher?")?
Wo finde ich weitere Dokumentation zu diesem Thema?
Antworten:
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 confirm
Methode, 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')
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
page.driver.browser
in Dereks Antwort
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
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
Der Capybara-Webkit- Treiber unterstützt dies ebenfalls.
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
Prickle bietet einige praktische Methoden für die Arbeit mit Popups in Selen und Webkit
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.
Versuchte die obigen Antworten ohne Glück. Am Ende hat das bei mir funktioniert:
@browser.alert.ok