我正在将 Ruby on Rails 与 Cucumber 和 Capybara 一起使用。
我将如何测试一个简单的确认命令(“你确定吗?”)?
另外,我在哪里可以找到有关此问题的更多文档?
我正在将 Ruby on Rails 与 Cucumber 和 Capybara 一起使用。
我将如何测试一个简单的确认命令(“你确定吗?”)?
另外,我在哪里可以找到有关此问题的更多文档?
selenium 驱动程序现在支持这个
从 Capybara 你可以像这样访问它:
page.driver.browser.switch_to.alert.accept
或者
page.driver.browser.switch_to.alert.dismiss
或者
page.driver.browser.switch_to.alert.text
不幸的是,在Capybara似乎没有办法做到这一点。但是,如果您使用 Selenium 驱动程序(可能还有其他支持 JavaScript 的驱动程序)运行测试,您可以破解它。就在执行将打开确认对话框的操作之前,重写该confirm
方法以始终返回 true。这样,对话框将永远不会显示,并且您的测试可以继续进行,就像用户按下了 OK 按钮一样。如果要模拟反向,只需将其更改为返回 false。
page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
我已经实现了这两个网络步骤/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
如果您想专门测试正在显示的消息,这里有一种特别笨拙的方法。我不认可它是漂亮的代码,但它可以完成工作。您需要加载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
更新当前版本的 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
这将单击命名按钮,然后接受带有文本匹配消息的确认框
capybara -webkit驱动程序也支持这一点。
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
Prickle添加了一些方便的方法来处理 selenium 和 webkit 中的弹出窗口
这个要点包含使用任何 Capybara 驱动程序在 Rails 2 和 3 中测试 JS 确认对话框的步骤。
这是对先前答案的改编,但不需要 jQuery Cookie 插件。
没有运气尝试了上述答案。最后这对我有用:
@browser.alert.ok