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


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

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

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

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

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



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


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.


0

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

@browser.alert.ok
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.