Como testar uma caixa de diálogo Confirmar com pepino?
-
20-09-2019 - |
Pergunta
Estou usando rubi nos trilhos com pepino e capybara.
Como eu testaria um comando de confirmação simples ("Você tem certeza?")?
Além disso, onde eu poderia encontrar mais documentação sobre esse assunto?
Solução
Parece que não há como fazer isso em Capybara, infelizmente. Mas se você estiver executando seus testes com o driver de Selenium (e provavelmente outros drivers que suportam o JavaScript), poderá invadi -lo. Pouco antes de executar a ação que trazia a caixa de diálogo confirmar, substituir 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ê deseja simular o inverso, basta alterá -lo para retornar false.
page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
Outras dicas
O driver de selênio agora suporta isso
De Capybara, você 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
Eu 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
Se você deseja testar especificamente a mensagem que está sendo exibida, aqui está uma maneira particularmente hacky de fazê -lo. Eu não o endosso como um código bonito, mas faz o trabalho. Você precisará carregar http://plugins.jquery.com/node/1386/release, ou altere -o para fazer cookies nativamente, se você não quiser jQuery.
Use esse 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 lançamentos atuais da Capybara. A maioria dos drivers da Capybara hoje apóia a API modal. Para aceitar um modal confirm que 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 em pepino com algo como
When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
accept_confirm msg do
click_button(button)
end
end
que clicará no botão nomeado e depois aceitará uma caixa de confirmação com texto correspondente à MSG
o Capybara-Webkit O motorista 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
Picada Adiciona alguns métodos de conveniência úteis para trabalhar com pop -ups em Selenium e Webkit
Esta essência Tem etapas para testar um JS confirmar a caixa de diálogo nos Rails 2 e 3 com qualquer motorista da 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