Estoy usando Ruby on Rails con pepino y capibara.
¿Cómo haría para probar un comando de confirmación simple ("¿Está seguro?")?
Además, ¿dónde puedo encontrar más documentación sobre este tema?
Estoy usando Ruby on Rails con pepino y capibara.
¿Cómo haría para probar un comando de confirmación simple ("¿Está seguro?")?
Además, ¿dónde puedo encontrar más documentación sobre este tema?
Respuestas:
Parece que no hay forma de hacerlo en Capybara, desafortunadamente. Pero si está ejecutando sus pruebas con el controlador Selenium (y probablemente con otros controladores que admitan JavaScript), puede piratearlo. Justo antes de realizar la acción que abriría el cuadro de diálogo de confirmación, anule el confirm
método para devolver siempre verdadero. De esa manera, el cuadro de diálogo nunca se mostrará y sus pruebas pueden continuar como si el usuario hubiera presionado el botón Aceptar. Si desea simular lo contrario, simplemente cámbielo para que devuelva falso.
page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
El controlador de selenio ahora admite esto
Desde Carpincho accederías así:
page.driver.browser.switch_to.alert.accept
o
page.driver.browser.switch_to.alert.dismiss
o
page.driver.browser.switch_to.alert.text
page.driver.browser
en la respuesta de Derek
Si desea probar específicamente el mensaje que se muestra, aquí hay una forma particularmente peligrosa de hacerlo. No lo apruebo como un código hermoso, pero hace el trabajo. Deberá cargar http://plugins.jquery.com/node/1386/release , o cambiarlo para hacer cookies de forma nativa si no desea 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
Actualizando esto para las versiones actuales de Capybara. La mayoría de los controladores de Capybara admiten la API modal. Para aceptar un modal de confirmación, harías
accept_confirm do # dismiss_confirm if not accepting
click_link 'delete' # whatever action triggers the modal to appear
end
Esto se puede usar en Pepino con algo como
When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
accept_confirm msg do
click_button(button)
end
end
que hará clic en el botón nombrado y luego aceptará un cuadro de confirmación con un mensaje de texto que coincida
El controlador capybara-webkit también lo admite.
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 agrega algunos métodos prácticos y prácticos para trabajar con ventanas emergentes en selenium y webkit
Esta esencia tiene pasos para probar un cuadro de diálogo de confirmación JS en Rails 2 y 3 con cualquier controlador de Capybara.
Es una adaptación de una respuesta anterior, pero no necesita el complemento jQuery Cookie.
Probé las respuestas anteriores sin suerte. Al final, esto funcionó para mí:
@browser.alert.ok