¿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')

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

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

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

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



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

1

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


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.


0

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

@browser.alert.ok
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.