Come testare una finestra di dialogo di conferma con Cucumber?


Risposte:


62

Sembra che non ci sia modo di farlo a Capybara, sfortunatamente. Ma se stai eseguendo i tuoi test con il driver Selenium (e probabilmente altri driver che supportano JavaScript), puoi hackerarlo. Appena prima di eseguire l'azione che farebbe apparire la finestra di dialogo di conferma, sovrascrivi il confirmmetodo per restituire sempre true. In questo modo la finestra di dialogo non verrà mai visualizzata e i test possono continuare come se l'utente avesse premuto il pulsante OK. Se vuoi simulare il contrario, cambia semplicemente per restituire falso.

page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')

Questo sembra non funzionare più in Firefox 4 ... la soluzione @ derek-ekins di seguito, da quello che mi dice Google, sembra essere più compatibile con le versioni future, anche se non posso ancora confermare (sono bloccato su Capybara 0.3.9).
carpeliam

1
Vedi la risposta sotto per l'utilizzo di "page.driver.browser.switch_to ..."
Thorbjørn Hermansen

134

Il driver del selenio ora lo supporta

Da Capybara accederesti in questo modo:

page.driver.browser.switch_to.alert.accept

o

page.driver.browser.switch_to.alert.dismiss

o

 page.driver.browser.switch_to.alert.text

2
Per chiunque altro dopo questo - si prega di notare che la risposta di Derek funziona davvero dove ho scoperto che il codice nella documentazione ufficiale del selenio non lo ha fatto (cetriolo / selenio). Notare la presenza di page.driver.browsernella risposta di Derek
Peter Nixey il

Peter - il codice qui è su misura per l'utilizzo di capybara mentre il codice nella documentazione è per quando usi direttamente selenium-webdriver - ho scritto anche quell'esempio, quindi spero che funzioni!
Derek Ekins

Ahh. Sì, buon punto e completamente mancato da me. In tal caso grazie per entrambi gli esempi.
Peter Nixey

39

Ho implementato questi due passaggi Web in /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

Se vuoi testare in modo specifico il messaggio visualizzato, ecco un modo particolarmente hacker per farlo. Non lo approvo come un bel codice, ma fa il suo lavoro. Dovrai caricare http://plugins.jquery.com/node/1386/release , o cambiarlo per fare i cookie in modo nativo se non vuoi jQuery.

Usa questo tipo di storia:

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

E questi passaggi

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
Bella soluzione! L'ho girato un po ', il che mi sembra più naturale: gist.github.com/727614
Mat Schaffer

Ed ecco un'altra versione di quel codice che supporta sia le caselle di avviso che di conferma, gist.github.com/919116
Matthew O'Riordan

3

Aggiornamento per le versioni correnti di Capybara. La maggior parte dei driver Capybara oggi supporta l'API modale. Per accettare una conferma modale faresti

accept_confirm do  # dismiss_confirm if not accepting
  click_link 'delete'  # whatever action triggers the modal to appear
end

Questo può essere usato in Cetriolo con qualcosa di simile

When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
  accept_confirm msg do
    click_button(button)
  end
end

che farà clic sul pulsante denominato e quindi accetterà una casella di conferma con msg di corrispondenza del testo



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


0

Questa sintesi ha i passaggi per testare una finestra di dialogo di conferma JS in Rails 2 e 3 con qualsiasi driver Capybara.

È un adattamento di una risposta precedente, ma non necessita del plugin jQuery Cookie.


0

Ho provato le risposte di cui sopra senza fortuna. Alla fine questo ha funzionato per me:

@browser.alert.ok
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.