2

我有一个带有删除链接的标准 Rails 应用程序。此删除链接带有浏览器弹出模式(使用 railsconfirm选项)。

我目前正在尝试使用 Cucumber、Selenium-Webdriver(或 Watir-Webdriver,尚未决定)和页面对象 gem 来测试删除功能。

触发模式后,我在页面上所做的任何事情都会给我以下错误:

Modal dialog present (Selenium::WebDriver::Error::UnhandledAlertError)

我一直在寻找,但找不到处理这种情况的方法。如果可能,我想继续使用PageFactory页面对象 gem 中的模块。

如何关闭/接受模式?

4

2 回答 2

1

我想出了一种方法来做到这一点,但还没有决定具体的实现方式。

在 Javascript 中,您可以覆盖任何函数,这意味着您可以覆盖confirm

这意味着您可以运行以下代码来禁用任何弹出窗口。

def disable_popups
  # don't return anything for alert
  browser.execute_script("window.alert = function() {}")

  # return some string for prompt to simulate user entering it
  browser.execute_script("window.prompt = function() {return 'my name'}")

  # return null for prompt to simulate clicking Cancel
  browser.execute_script("window.prompt = function() {return null}")

  # return true for confirm to simulate clicking OK
  browser.execute_script("window.confirm = function() {return true}")

  # return false for confirm to simulate clicking Cancel
  browser.execute_script("window.confirm = function() {return false}")
end

如果你把它放在initalize_pagea 的函数中,page-object那么对话框会被自动删除。

def initialize_page
    disable_popups
end

或者您可以在触发弹出之前立即执行此操作

def delete
  disable_popups
  delete_link # => clicks the link
end

参考:

于 2013-09-05T12:14:58.960 回答
0

页面对象 gem 具有处理 javascript 弹出窗口的方法 - 请参阅原始页面对象 gem 帖子。在你的情况下,我相信你想要confirm方法::

(字符串)确认(响应,帧 = nil,&block)

覆盖正常的确认弹出窗口,使其不会发生。

例子:

message = @popup.confirm(true) 做
   @page.button_that_causes_confirm
结束

参数:

  • what (bool) — 你想从确认弹出窗口返回的响应
  • frame (默认为: nil) — 当确认嵌套在框架中时使用的可选参数
  • 块 — 具有将导致确认显示的调用的块

回报:

(String) — 确认中提示的消息

警报和提示弹出窗口也有类似的情况。

在您的页面对象中,我将定义:

class MyPage
  link(:delete_link, :id=>'delete')

  def delete()
    confirm(true){ delete_link }
  end
end 

然后当您调用 page.delete 时,它​​将单击链接并确认弹出窗口。

于 2013-09-05T13:08:16.147 回答