Comment tester une boîte de dialogue de confirmation avec Cucumber?

86

J'utilise Ruby on Rails avec du concombre et du capybara.

Comment procéder pour tester une simple commande de confirmation ("Êtes-vous sûr?")?

De plus, où puis-je trouver de la documentation supplémentaire sur ce problème?

Yuval Karmi
la source
Si vous utilisez Capybara-webkit, vous trouverez votre réponse ici: stackoverflow.com/questions/6930927/…
Adrien

Réponses:

62

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, remplacez la confirmméthode pour toujours retourner true. 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, modifiez-le simplement pour renvoyer false.

page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
Théo
la source
Cela ne semble plus fonctionner dans Firefox 4 ... La solution @ derek-ekins ci-dessous, d'après ce que Google me dit, semble être plus compatible avec les avancées, même si je ne peux pas encore confirmer (je suis bloqué sur Capybara 0.3.9).
carpeliam
1
Voir la réponse ci-dessous pour l'utilisation de «page.driver.browser.switch_to ...»
Thorbjørn Hermansen
134

Le pilote sélénium prend désormais en charge cela

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
Derek Ekins
la source
2
Pour quiconque suit ceci - veuillez noter que la réponse de Derek fonctionne effectivement là où j'ai trouvé que le code dans la documentation officielle de Selenium ne fonctionnait pas (concombre / Selenium). Notez la présence de page.driver.browserdans la réponse de Derek
Peter Nixey
Peter - le code ici est spécialement conçu pour utiliser capybara alors que le code dans la documentation est pour lorsque vous utilisez sélénium-webdriver directement - j'ai également écrit cet exemple, donc j'espère que cela fonctionne!
Derek Ekins
Ahh. Oui, bon point et complètement manqué par moi. Dans ce cas, merci pour les deux exemples.
Peter Nixey
39

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
Dynamick
la source
8

Si vous souhaitez tester spécifiquement le message affiché, voici une manière particulièrement pirate de le faire. Je ne le considère pas comme un beau code, mais il fait le travail. Vous devrez charger http://plugins.jquery.com/node/1386/release , ou le modifier pour faire des cookies de manière native si vous ne voulez pas de 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
Jon Wood
la source
2
Solution cool! Je l'ai retourné un peu, ce qui me semble plus naturel: gist.github.com/727614
Mat Schaffer
Et voici une autre version de ce code qui prend en charge à la fois les boîtes d'alerte et de confirmation, gist.github.com/919116
Matthew O'Riordan
3

Mise à jour pour les versions actuelles de Capybara. La plupart des pilotes Capybara prennent aujourd'hui en charge l'API modale. Pour accepter un modal de confirmation, 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 cliquera sur le bouton nommé puis acceptera une boîte de confirmation avec le texte correspondant au msg

Thomas Walpole
la source
2
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
hainguyen
la source
1

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

Chris Bloom
la source
0

Cet essentiel contient des étapes pour tester une boîte de dialogue de confirmation JS dans les 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.

Joël Cogen
la source
0

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

@browser.alert.ok
Andy Stannard
la source