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?

82
demandé sur Mohsin Awan 2010-03-17 01:31:26

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')
59
répondu Theo 2010-04-09 16:44:48

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
131
répondu Derek Ekins 2011-07-14 09:57:42

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
38
répondu Dynamick 2012-05-08 11:12:58

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
8
répondu Jon Wood 2010-11-15 17:05:21

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

3
répondu Thomas Walpole 2016-01-26 09:45:16

le pilote capybara-webkit le supporte aussi.

2
répondu regulatethis 2012-12-15 08:54:47
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
2
répondu hainguyen 2014-05-26 09:46:16

Prickle ajoute quelques méthodes pratiques pour travailler avec des popups dans le sélénium et webkit

1
répondu Chris Bloom 2012-05-15 04:00:08

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.

0
répondu Joel Cogen 2011-09-27 14:58:48

a essayé les réponses ci-dessus sans succès. En fin de compte cela a fonctionné pour moi:

@browser.alert.ok
0
répondu Andy Stannard 2015-09-16 15:12:45