如何用黄瓜测试确认对话框?


Answers:


62

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

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

从Firefox看来,这在Firefox 4中似乎不再起作用了。 0.3.9)。
carpeliam 2011年

1
请参阅下面的答案中使用“page.driver.browser.switch_to ......”
托尔比约恩满森

134

硒驱动程序现在支持此功能

在Capybara中,您可以这样访问它:

page.driver.browser.switch_to.alert.accept

要么

page.driver.browser.switch_to.alert.dismiss

要么

 page.driver.browser.switch_to.alert.text

2
对于其他任何关注此问题的人-请注意,在我发现Selenium官方文档中的代码无效(黄瓜/ Selenium)的情况下,Derek的回答确实有效。注意page.driver.browser德里克答案中的存在
Peter Nixey

彼得-这里的代码是专门为使用水豚而量身定制的,而文档中的代码则是针对您直接使用selenium-webdriver时的代码-我也写了这个示例,希望如此!
德里克·埃金斯

啊 是的,很好,完全被我错过了。在这种情况下,谢谢您提供这两个示例。
彼得·尼克西

39

我已经在中实现了这两个Web步骤/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

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

2
很酷的解决方案!我将它翻转了一点,这对我来说更自然:gist.github.com/727614
Mat Schaffer 2010年

这是该代码的另一个版本,它同时支持警报和确认框,gist.github.com / 919116
Matthew O'Riordan

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匹配的文本的确认框



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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.