Estou usando Ruby on Rails com Cucumber e Capybara.
Como eu testaria um comando de confirmação simples ("Tem certeza?")?
Além disso, onde posso encontrar mais documentação sobre esse problema?
Estou usando Ruby on Rails com Cucumber e Capybara.
Como eu testaria um comando de confirmação simples ("Tem certeza?")?
Além disso, onde posso encontrar mais documentação sobre esse problema?
Respostas:
Parece que não há como fazer isso na Capivara, infelizmente. Mas se você estiver executando seus testes com o driver Selenium (e provavelmente outros drivers que suportam JavaScript), você pode hackea-lo. Antes de executar a ação que abriria a caixa de diálogo de confirmação, substitua o confirm
método para sempre retornar verdadeiro. Dessa forma, a caixa de diálogo nunca será exibida e seus testes podem continuar como se o usuário tivesse pressionado o botão OK. Se você quiser simular o reverso, basta alterá-lo para retornar falso.
page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
O driver de selênio agora suporta este
Da Capivara você o acessaria assim:
page.driver.browser.switch_to.alert.accept
ou
page.driver.browser.switch_to.alert.dismiss
ou
page.driver.browser.switch_to.alert.text
page.driver.browser
na resposta de Derek
Se você deseja testar especificamente a mensagem que está sendo exibida, aqui está uma maneira particularmente prática de fazer isso. Eu não endosso isso como um código bonito, mas ele dá conta do recado. Você precisará carregar http://plugins.jquery.com/node/1386/release ou alterá-lo para fazer cookies nativamente se não quiser jQuery.
Use este tipo de história:
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 essas etapas
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
Atualizando isso para versões atuais do Capybara. A maioria dos drivers Capybara hoje suporta a API modal. Para aceitar um modal de confirmação, você faria
accept_confirm do # dismiss_confirm if not accepting
click_link 'delete' # whatever action triggers the modal to appear
end
Isso pode ser usado no pepino com algo como
When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
accept_confirm msg do
click_button(button)
end
end
que irá clicar no botão nomeado e então aceitar uma caixa de confirmação com o texto correspondente à mensagem
O driver capivara-webkit também suporta isso.
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 adiciona alguns métodos convenientes para trabalhar com pop-ups em selênio e webkit
Esta essência contém etapas para testar uma caixa de diálogo de confirmação JS no Rails 2 e 3 com qualquer driver Capybara.
É uma adaptação de uma resposta anterior, mas não precisa do plugin jQuery Cookie.
Tentei as respostas acima sem sorte. No final, isso funcionou para mim:
@browser.alert.ok