web-dev-qa-db-fra.com

Comment tester un dialogue de confirmation avec Cucumber?

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?

84
Yuval Karmi

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')
59
Theo

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
132
Derek Ekins

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
38
Dynamick

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
8
Jon Wood

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

3
Thomas Walpole
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
hainguyen

Le pilote capybara-webkit le prend également en charge.

2
regulatethis

Prickle ajoute des méthodes pratiques pour travailler avec les popups dans Selenium et webkit

1
Chris Bloom

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.

0
Joel Cogen

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

@browser.alert.ok
0
Andy Stannard