Sto usando Ruby on Rails con Cucumber e Capybara.
Come posso provare un semplice comando di conferma ("Sei sicuro?")?
Inoltre, dove posso trovare ulteriore documentazione su questo problema?
Sto usando Ruby on Rails con Cucumber e Capybara.
Come posso provare un semplice comando di conferma ("Sei sicuro?")?
Inoltre, dove posso trovare ulteriore documentazione su questo problema?
Risposte:
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 confirm
metodo 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')
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
page.driver.browser
nella risposta di Derek
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
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
Anche il driver capybara-webkit supporta questo.
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 aggiunge alcuni utili metodi pratici per lavorare con i popup in selenio e webkit
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.
Ho provato le risposte di cui sopra senza fortuna. Alla fine questo ha funzionato per me:
@browser.alert.ok