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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top