J'utilise Ruby on Rails avec Concombre et Capybara.
Comment pourrais-je tester une simple commande de confirmation ("Êtes-vous sûr?")?
De plus, où pourrais-je trouver de la documentation supplémentaire sur ce problème?
On dirait qu'il n'y a aucun moyen de le faire à Capybara, malheureusement. Mais si vous exécutez vos tests avec le pilote Selenium (et probablement d’autres pilotes prenant en charge JavaScript), vous pouvez le pirater. Juste avant d'effectuer l'action qui ferait apparaître la boîte de dialogue de confirmation, substituez la méthode confirm
pour toujours renvoyer true. Ainsi, la boîte de dialogue ne sera jamais affichée et vos tests pourront continuer comme si l'utilisateur avait appuyé sur le bouton OK. Si vous voulez simuler l'inverse, changez-le simplement pour retourner false.
page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
Le pilote Selenium supporte maintenant ceci
Depuis Capybara, vous y accéderiez comme ceci:
page.driver.browser.switch_to.alert.accept
ou
page.driver.browser.switch_to.alert.dismiss
ou
page.driver.browser.switch_to.alert.text
J'ai implémenté ces deux étapes Web dans /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
Si vous souhaitez tester spécifiquement le message affiché, voici une manière particulièrement astucieuse de le faire. Je n'approuve pas cela comme un code magnifique, mais il fait le travail. Vous devrez charger http://plugins.jquery.com/node/1386/release , ou le modifier pour créer des cookies de manière native si vous ne voulez pas jQuery.
Utilisez ce genre d'histoire:
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
Et ces pas
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
Mise à jour pour les versions actuelles de Capybara. La plupart des pilotes Capybara actuels prennent en charge l’API modale. Accepter un mode de confirmation que vous feriez
accept_confirm do # dismiss_confirm if not accepting
click_link 'delete' # whatever action triggers the modal to appear
end
Ceci peut être utilisé dans Concombre avec quelque chose comme
When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
accept_confirm msg do
click_button(button)
end
end
qui va cliquer sur le bouton nommé puis accepter une boîte de confirmation avec le texte correspondant msg
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
Le pilote capybara-webkit le prend également en charge.
Prickle ajoute des méthodes pratiques pour travailler avec les popups dans Selenium et webkit
This Gist comporte des étapes pour tester une boîte de dialogue de confirmation JS dans Rails 2 et 3 avec n'importe quel pilote Capybara.
C'est une adaptation d'une réponse précédente, mais n'a pas besoin du plugin jQuery Cookie.
J'ai essayé les réponses ci-dessus sans succès. En fin de compte cela a fonctionné pour moi:
@browser.alert.ok