86

我正在将 Ruby on Rails 与 Cucumber 和 Capybara 一起使用。

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

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

4

10 回答 10

135

selenium 驱动程序现在支持这个

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

page.driver.browser.switch_to.alert.accept

或者

page.driver.browser.switch_to.alert.dismiss

或者

 page.driver.browser.switch_to.alert.text
于 2011-02-15T10:43:52.873 回答
62

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

page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
于 2010-04-09T16:44:48.760 回答
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
于 2011-05-12T09:46:27.987 回答
8

如果您想专门测试正在显示的消息,这里有一种特别笨拙的方法。我不认可它是漂亮的代码,但它可以完成工作。您需要加载http://plugins.jquery.com/node/1386/release,或者如果您不想要 jQuery,则将其更改为本地执行 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
于 2010-11-15T17:05:21.557 回答
3

更新当前版本的 Capybara。目前大多数 Capybara 驱动程序都支持模态 API。要接受确认模式,您会这样做

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

这可以在 Cucumber 中使用,例如

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

这将单击命名按钮,然后接受带有文本匹配消息的确认框

于 2016-01-26T09:45:16.167 回答
2

capybara -webkit驱动程序也支持这一点。

于 2012-12-15T08:54:47.970 回答
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
于 2014-05-26T09:46:16.890 回答
1

Prickle添加了一些方便的方法来处理 selenium 和 webkit 中的弹出窗口

于 2012-05-15T04:00:08.137 回答
0

这个要点包含使用任何 Capybara 驱动程序在 Rails 2 和 3 中测试 JS 确认对话框的步骤。

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

于 2011-09-27T14:58:48.570 回答
0

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

@browser.alert.ok
于 2015-09-16T15:12:45.163 回答