automated-tests - rack_test - capybara vs selenium
¿Cómo probar un diálogo de confirmación con Pepino? (10)
Actualizando esto para las versiones actuales de Capybara. La mayoría de los conductores de Capybara hoy soportan la API modal. Para aceptar un modal de confirmación, lo 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 texto que coincida con el mensaje
Estoy usando Ruby on Rails con Cucumber and Capybara.
¿Cómo voy a probar un comando de confirmación simple ("¿Estás seguro?")?
Además, ¿dónde podría encontrar más documentación sobre este tema?
El controlador capybara-webkit compatible con esto también.
El controlador de selenio ahora es compatible con esto
Desde Capibara 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
Implementé 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
Probé las respuestas anteriores sin suerte. Al final, esto funcionó para mí:
@browser.alert.ok
Si desea probar específicamente el mensaje que se muestra, aquí hay una manera particularmente hacky de hacerlo. No lo respaldo como código bonito, pero hace el trabajo bien. Tendrá que cargar http://plugins.jquery.com/node/1386/release , o cambiarlo para hacer cookies de forma nativa si no desea jQuery.
Usa 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
Esta esencia tiene pasos para probar un diálogo de confirmación de 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.
Prickle agrega algunos prácticos métodos de conveniencia para trabajar con ventanas emergentes en selenio y webkit
Parece que no hay forma de hacerlo en Capibara, desafortunadamente. Pero si está ejecutando sus pruebas con el controlador Selenium (y probablemente otros controladores compatibles con JavaScript), puede hackearlo. Justo antes de realizar la acción que mostraría el diálogo de confirmación, anule el método de confirm
para que siempre devuelva verdadero. De esa forma, el cuadro de diálogo nunca se mostrará, y sus pruebas pueden continuar como si el usuario hubiera presionado el botón OK. Si desea simular lo contrario, simplemente cámbielo para devolver falso.
page.evaluate_script(''window.confirm = function() { return true; }'')
page.click(''Remove'')
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