Comment tester un dialogue de confirmation avec Cucumber?
J'utilise du rubis sur Rails avec du concombre et du Capybara.
Comment tester une simple commande de confirmation ("Are you sure?")?
en outre, Où puis-je trouver plus de documentation sur cette question?
10 réponses
semble comme il n'y a aucun moyen de le faire à Capybara, malheureusement. Mais si vous faites vos tests avec le pilote Selenium (et probablement d'autres pilotes qui supportent JavaScript), vous pouvez le pirater. Juste avant d'effectuer l'action qui soulèverait la boîte de dialogue Confirmer, outrepasser la méthode confirm
pour toujours retourner true. De cette façon, le dialogue ne sera jamais affiché, et vos tests peuvent continuer comme si l'utilisateur avait appuyé sur le bouton OK. Si vous voulez simuler l'inverse, tout simplement changer de fausse déclaration.
page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
le pilote de sélénium supporte maintenant ce
de Capybara vous y accéderez 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 mis en œuvre 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 voulez tester spécifiquement le message affiché, voici une particulièrement hacky façon de le faire. Je ne cautionne pas beau code, mais il fait le travail. Vous devez charger http://plugins.jquery.com/node/1386/release , ou le modifier pour faire des cookies nativement 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 étapes
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 de ce pour les versions actuelles de Capybara. La plupart des pilotes Capybara prennent aujourd'hui en charge l'API modale. Pour accepter une confirmation modale vous feriez
accept_confirm do # dismiss_confirm if not accepting
click_link 'delete' # whatever action triggers the modal to appear
end
cela peut être utilisé dans le 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 le bouton nommé et ensuite 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
Prickle ajoute quelques méthodes pratiques pour travailler avec des popups dans le sélénium et webkit
Ce gist a procédure de test d'un JS boîte de dialogue de confirmation dans les Rails 2 et 3 avec tout le Capybara pilote.
c'est une adaptation d'une réponse précédente, mais n'a pas besoin du plugin de Cookie jQuery.
a essayé les réponses ci-dessus sans succès. En fin de compte cela a fonctionné pour moi:
@browser.alert.ok