如何使用Cucumber测试确认对话框?

时间:2010-03-16 22:31:26

标签: automated-tests capybara integration-testing

我正在使用带有Cucumber和Capybara的Ruby on Rails。

我如何测试一个简单的确认命令(“你确定吗?”)?

另外,我在哪里可以找到有关此问题的进一步文档?

10 个答案:

答案 0 :(得分:133)

硒司机now supports this

从Capybara你可以像这样访问它:

page.driver.browser.switch_to.alert.accept

page.driver.browser.switch_to.alert.dismiss

 page.driver.browser.switch_to.alert.text

答案 1 :(得分:60)

不幸的是,似乎在Capybara没有办法做到这一点。但是,如果您使用Selenium驱动程序(以及可能支持JavaScript的其他驱动程序)运行测试,则可以破解它。在执行将显示确认对话框的操作之前,覆盖confirm方法以始终返回true。这样,对话框将永远不会显示,您的测试可以继续,就像用户按下OK按钮一样。如果要模拟反向,只需将其更改为返回false。

page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')

答案 2 :(得分:39)

我已在/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

答案 3 :(得分:8)

如果您想专门测试正在显示的消息,这是一种特别苛刻的方法。我并不赞同它是美丽的代码,但它完成了工作。如果您不想使用jQuery,则需要加载http://plugins.jquery.com/node/1386/release,或者将其更改为本地执行cookie。

使用这种故事:

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

这些步骤

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

答案 4 :(得分:3)

为当前版本的Capybara更新此内容。今天大多数Capybara驱动程序都支持模态API。要接受确认模式,你会做

accept_confirm do  # dismiss_confirm if not accepting
  click_link 'delete'  # whatever action triggers the modal to appear
end

这可以在黄瓜中使用

之类的东西
When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
  accept_confirm msg do
    click_button(button)
  end
end

将单击命名按钮,然后接受文本与msg匹配的确认框

答案 5 :(得分:2)

capybara-webkit驱动程序也支持此功能。

答案 6 :(得分: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

答案 7 :(得分:1)

Prickle为在selenium和webkit中使用弹出窗口添加了一些方便的便捷方法

答案 8 :(得分:0)

This gist有步骤在任何Capybara驱动程序中测试Rails 2和3中的JS确认对话框。

它是对先前答案的改编,但不需要jQuery Cookie插件。

答案 9 :(得分:0)

没有运气,尝试了上述答案。最后这对我有用:

@browser.alert.ok