2010-03-16 7 views
82

Ich benutze Ruby on Rails mit Gurke und Capybara.Wie testet man einen Bestätigungsdialog mit Gurke?

Wie würde ich zum Testen eines einfachen Bestätigungsbefehls ("Sind Sie sicher?") Gehen?

Wo finde ich auch weitere Dokumentation zu diesem Thema?

+0

Wenn Sie Capybara-webkit verwenden, finden Sie Ihre Antwort dort: http://stackoverflow.com/questions/6930927/how-do-i-confirm-a-javascript-popup-with-capybara# – Adrien

Antwort

59

Scheint, es gibt leider keine Möglichkeit, es in Capybara zu tun. Aber wenn Sie Ihre Tests mit dem Selenium-Treiber (und wahrscheinlich anderen Treibern, die JavaScript unterstützen) ausführen, können Sie es hacken. Bevor Sie die Aktion ausführen, durch die der Bestätigungsdialog aufgerufen wird, überschreiben Sie die Methode confirm, um immer "true" zurückzugeben. Auf diese Weise wird der Dialog nie angezeigt und Ihre Tests können so fortgesetzt werden, als hätte der Benutzer die OK-Taste gedrückt. Wenn Sie das Umgekehrte simulieren möchten, ändern Sie es einfach, um false zurückzugeben.

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

genial! Danke! –

+0

Dies scheint nicht mehr in Firefox 4 zu funktionieren ... @ Derek-ekins Lösung unten, von dem, was Google mir sagt, scheint weiter aufwärtskompatibel zu sein, obwohl ich gerade noch nicht bestätigen kann (ich bleibe dran Capybara 0.3.9). – carpeliam

+1

Siehe Antwort unten für die Verwendung von "page.driver.browser.switch_to ..." –

8

Wenn Sie die angezeigte Nachricht speziell testen möchten, hier ist ein besonders hacky Weg. Ich unterstütze es nicht als schönen Code, aber es macht die Arbeit erledigt. Sie müssen http://plugins.jquery.com/node/1386/release laden oder ändern, um Cookies nativ auszuführen, 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 
+2

Coole Lösung! Ich habe es ein wenig herumgedreht, was sich für mich natürlicher anfühlt: https://gist.github.com/727614 –

+0

Und hier ist eine weitere Version dieses Codes, der sowohl Alarm- als auch Bestätigungsfelder unterstützt, https://gist.github.com/ 919116 –

131

Der Selen-Treiber now supports this

Von Capybara würden Sie es wie folgt zugreifen:

page.driver.browser.switch_to.alert.accept 

oder

page.driver.browser.switch_to.alert.dismiss 

oder

page.driver.browser.switch_to.alert.text 
+2

Für alle anderen - bitte beachten Sie, dass Dereks Antwort in der Tat funktioniert, wo ich fand, dass der Code in der offiziellen Selenium-Dokumentation nicht (Gurke/Selen). Beachten Sie das Vorhandensein von "page.driver.browser" in Dereks Antwort –

+0

Peter - der Code hier ist speziell für die Verwendung von Capybara zugeschnitten, während der Code in der Dokumentation sind für, wenn Sie selen-webdriver direkt verwenden - Ich schrieb dieses Beispiel auch so Ich hoffe, es funktioniert! –

+0

Ahh. Ja, guter Punkt und völlig von mir vermisst. In diesem Fall danke für beide Beispiele. –

38

ich diese beiden Web-Schritte in /features/step_definitions/web_steps.rb implementiert haben:

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 
+0

süß! Es klappt! – corroded

0

This gist hat Schritte ein JS Bestätigungsdialog in Rails 2 und 3 zu testen, mit ein Capybara-Fahrer.

Es ist eine Anpassung einer früheren Antwort, benötigt aber nicht das jQuery Cookie-Plugin.

1

Prickle fügt einige praktische Bequemlichkeit Methoden für die Pop-ups in Selen und Webkit arbeiten

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

Versucht die obigen Antworten ohne Glück. Am Ende funktionierte das für mich:

@browser.alert.ok 
3

Aktualisierung für aktuelle Capybara-Versionen. Die meisten Capybara-Treiber unterstützen heute die modale API.Um eine Bestätigungs zu akzeptieren modal Sie

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

Dies kann wie

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

, die die Namen Schaltfläche klicken und dann ein Bestätigungsfeld mit passendem Text msg akzeptieren