Cómo probar un diálogo de confirmación con el pepino?
-
20-09-2019 - |
Pregunta
Estoy usando Ruby on Rails con pepino y Carpincho.
¿Cómo hago para probar un comando confirmar sencilla ( "¿Está seguro?")?
Además, ¿dónde podría encontrar más documentación sobre este tema?
Solución
Parece que no hay manera de hacerlo en capibara, por desgracia. Pero si se está ejecutando sus pruebas con el conductor selenio (y probablemente otros conductores que soportan JavaScript), puede entrar ilegalmente en él. Justo antes de realizar la acción que aparezca el diálogo de confirmación, reemplazar el método confirm
para volver siempre es cierto. De esa manera no se mostrará el cuadro de diálogo, y sus pruebas puede continuar como si el usuario hubiera pulsado el botón OK. Si desea simular la inversa, sólo tiene que cambiar para volver falsa.
page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
Otros consejos
El conductor ahora es compatible con este
A partir de capibara que accedería a ello como esto:
page.driver.browser.switch_to.alert.accept
o
page.driver.browser.switch_to.alert.dismiss
o
page.driver.browser.switch_to.alert.text
He aplicado estos dos pasos web en /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 desea probar específicamente el mensaje que se muestra, esto es una forma particularmente hacky para hacerlo. No estoy de acuerdo como código hermoso, pero hace el trabajo. Tendrá que cargar http://plugins.jquery.com/node/1386/release, o cambiarlo a hacer galletas de forma nativa si no quiere jQuery.
Utilice este tipo de historia:
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
Y estos pasos
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
La actualización de esta para las versiones actuales de carpincho. La mayoría de los conductores Capybara hoy el soporte de la API modal. Para aceptar un referente confirman que haría
accept_confirm do # dismiss_confirm if not accepting
click_link 'delete' # whatever action triggers the modal to appear
end
Esto se puede utilizar en pepino con algo como
When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
accept_confirm msg do
click_button(button)
end
end
que haga clic en el botón de llamada y luego aceptar un cuadro Confirmar con msg texto coincidente
El capibara-webkit apoya conductor esto también.
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 añade algunos métodos de conveniencia prácticos para trabajar con ventanas emergentes en selenio y webkit
Esta GIST tiene pasos para probar un diálogo de confirmación JS en los carriles 2 y 3 con cualquier controlador Capybara.
Es una adaptación de una respuesta anterior, pero no necesita el plugin de jQuery Cookie.
Probamos las respuestas anteriores sin suerte. Al final, esto funcionó para mí:
@browser.alert.ok