¿Cómo probar un diálogo de confirmación con Cucumber?

Respuestas:

62

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 confirmmé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')
Theo
fuente
Esto parece no funcionar más en Firefox 4 ... la solución de @ derek-ekins a continuación, por lo que me dice Google, parece ser más compatible con versiones posteriores, aunque todavía no puedo confirmar (estoy atascado en Capybara 0.3.9).
carpeliam
1
Vea la respuesta a continuación para usar "page.driver.browser.switch_to ..."
Thorbjørn Hermansen
134

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
Derek Ekins
fuente
2
Para cualquier otra persona que siga esto, tenga en cuenta que la respuesta de Derek sí funciona cuando descubrí que el código en la documentación oficial de Selenium no (pepino / Selenium). Tenga en cuenta la presencia de page.driver.browseren la respuesta de Derek
Peter Nixey
Peter: el código aquí está diseñado específicamente para usar carpincho, mientras que el código en los documentos es para cuando estás usando selenium-webdriver directamente. También escribí ese ejemplo, ¡así que espero que funcione!
Derek Ekins
Ahh. Sí, buen punto y completamente perdido por mí. En ese caso, gracias por ambos ejemplos.
Peter Nixey
39

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
Dynamick
fuente
8

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
Jon Wood
fuente
2
¡Solución genial! Le di la vuelta un poco, lo que me resulta
Mat Schaffer
Y aquí hay otra versión de ese código que admite cuadros de alerta y confirmación, gist.github.com/919116
Matthew O'Riordan
3

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

Thomas Walpole
fuente
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
hainguyen
fuente
1

Prickle agrega algunos métodos prácticos y prácticos para trabajar con ventanas emergentes en selenium y webkit

Chris Bloom
fuente
0

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.

Joel Cogen
fuente
0

Probé las respuestas anteriores sin suerte. Al final, esto funcionó para mí:

@browser.alert.ok
Andy Stannard
fuente