Comment tester une boîte de dialogue de confirmation avec concombre?
-
20-09-2019 - |
Question
J'utilise Ruby on Rails avec concombre et Capybara.
Comment pourrais-je aller sur le test d'une simple commande de confirmation ( « Etes-vous sûr? »)?
En outre, où pourrais-je trouver d'autres documents à ce sujet?
La solution
On dirait qu'il n'y a pas moyen de le faire dans Capybara, malheureusement. Mais si vous utilisez vos tests avec le pilote Sélénium (et les pilotes probablement d'autres qui prennent en charge JavaScript), vous pouvez pirater. Juste avant d'effectuer l'action qui apporterait la boîte de dialogue de confirmation, remplacer la méthode confirm
pour revenir toujours vrai. De cette façon, la boîte de dialogue ne sera jamais affichée et vos tests peuvent continuer comme si l'utilisateur avait appuyé sur le bouton OK. Si vous souhaitez simuler l'inverse, il suffit de changer pour revenir faux.
page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
Autres conseils
Le pilote sélénium prend désormais en charge cette
De Capybara vous y accéder 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
Je l'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 façon particulièrement hacky de le faire. Je ne cautionne pas aussi beau code, mais il fait le travail. Vous aurez besoin de charger http://plugins.jquery.com/node/1386/release, ou changer pour faire des cookies en mode natif 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 cela pour les versions en cours de Capybara. La plupart des pilotes Capybara prennent en charge aujourd'hui l'API modale. Pour accepter que vous feriez modal confirmer
accept_confirm do # dismiss_confirm if not accepting
click_link 'delete' # whatever action triggers the modal to appear
end
Ceci 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 cliquez sur le bouton nommé puis accepter une boîte de confirmation avec msg correspondant texte
Le capybara-webkit pilote prend en charge aussi.
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 des méthodes pratiques à portée de main pour travailler avec popups en sélénium et webkit
Cet essentiel a pas de tester une boîte de dialogue de confirmation de JS dans Rails 2 et 3 avec tout pilote Capybara.
Il est une adaptation d'une réponse précédente, mais n'a pas besoin du plug-in Cookie jQuery.
Essayé les réponses ci-dessus avec pas de chance. En fin de compte cela a fonctionné pour moi:
@browser.alert.ok