Como testar uma caixa de diálogo de confirmação com Cucumber?

86

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?

Yuval Karmi
fonte
Se você estiver usando o Capybara-webkit, encontrará sua resposta lá: stackoverflow.com/questions/6930927/…
Adrien

Respostas:

61

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 confirmmé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')
Theo
fonte
Isso parece não funcionar mais no Firefox 4 ... @derek-ekins solução abaixo, pelo que o Google me disse, parece ser mais compatível com versões futuras, embora eu não possa confirmar ainda (estou preso no Capybara 0.3.9).
carpeliam
1
Veja a resposta abaixo para usar "page.driver.browser.switch_to ..."
Thorbjørn Hermansen
133

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
Derek Ekins
fonte
2
Para qualquer outra pessoa que segue isso - observe que a resposta de Derek realmente funciona onde eu descobri que o código na documentação oficial do Selenium não (pepino / Selenium). Observe a presença de page.driver.browserna resposta de Derek
Peter Nixey
Peter - o código aqui é feito especificamente para usar capivara, enquanto o código nos documentos é para quando você está usando selenium-webdriver diretamente - eu escrevi esse exemplo também, então espero que funcione!
Derek Ekins
Ahh. Sim, bom ponto e completamente perdido por mim. Nesse caso, obrigado por ambos os exemplos.
Peter Nixey
39

Implementei essas duas etapas da web em /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
Dynamick
fonte
8

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
Jon Wood
fonte
2
Solução legal! Eu virei um pouco, o que parece mais natural para mim: gist.github.com/727614
Mat Schaffer
E aqui está outra versão desse código que suporta caixas de alerta e confirmação, gist.github.com/919116
Matthew O'Riordan
3

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

Thomas Walpole
fonte
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
Hainguyen
fonte
1

Prickle adiciona alguns métodos convenientes para trabalhar com pop-ups em selênio e webkit

Chris Bloom
fonte
0

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.

Joel Cogen
fonte
0

Tentei as respostas acima sem sorte. No final, isso funcionou para mim:

@browser.alert.ok
Andy Stannard
fonte