Come testare un dialogo di conferma con cetrioli?
-
20-09-2019 - |
Domanda
Sto usando Ruby on Rails con cetriolo e Capybara.
Come potrei fare per testare un semplice comando confirm ( "Sei sicuro?")?
Inoltre, dove posso trovare ulteriore documentazione su questo tema?
Soluzione
Sembra che non c'è modo di farlo in Capybara, purtroppo. Ma se si sta eseguendo i test con il driver selenio (e probabilmente altri driver che supportano JavaScript), è possibile modificarlo. Poco prima di eseguire l'azione che avrebbe portato la finestra di dialogo di conferma, l'override del metodo confirm
per tornare sempre vero. In questo modo non sarà mai visualizzata la finestra di dialogo, e le vostre prove può continuare come se l'utente avesse premuto il pulsante OK. Se si desidera simulare il contrario, è sufficiente modificare a restituire false.
page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
Altri suggerimenti
Il driver selenio ora supporta questo
Da Capybara si accedere 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
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
Se si desidera verificare in particolare il messaggio che viene visualizzato, ecco un modo particolarmente hacky per farlo. Io non condivido come codice bello, ma ottiene il lavoro fatto. Avrai bisogno di caricare http://plugins.jquery.com/node/1386/release, o modificarlo per fare i biscotti in modo nativo, se non si vuole jQuery.
Utilizzare 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
L'aggiornamento di queste per le versioni attuali di Capybara. La maggior parte dei piloti Capybara oggi supportano l'API modale. Per accettare un modale conferma fareste
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 come
When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
accept_confirm msg do
click_button(button)
end
end
che fare clic sul pulsante di nome e quindi accettare una scatola di conferma con la corrispondenza del testo msg
Il capibara-webkit supporta conducente anche 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 metodi di convenienza a portata di mano per lavorare con i popup in selenio e webkit
Questo succo ha gradini per testare una finestra di conferma JS in Rails 2 e 3 con qualsiasi driver Capybara.
E 'un adattamento di un precedente risposta, ma non ha bisogno del plugin jQuery Cookie.
Ho cercato le risposte di cui sopra senza fortuna. Alla fine questo ha funzionato per me:
@browser.alert.ok