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?
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?
Réponses:
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 confirm
mé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')
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
page.driver.browser
dans la réponse de Derek
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
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
Le pilote capybara-webkit le prend également en charge.
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 pour travailler avec des popups dans le sélénium et le webkit
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.
J'ai essayé les réponses ci-dessus sans succès. En fin de compte, cela a fonctionné pour moi:
@browser.alert.ok