【问题标题】:How do you automatically confirm a modal in ruby using page-object?如何使用页面对象自动确认 ruby​​ 中的模式?
【发布时间】:2013-09-05 21:08:16
【问题描述】:

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

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

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

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

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

如何关闭/接受模式?

【问题讨论】:

  • 你能举一个你遇到的模态对话框的例子吗?我相信类型会影响您与它的交互方式。例如,javascript 警报和 jQueryUI 模态对话框都是模态的,但交互方式不同(至少由 Watir)。
  • 这是标准的 Rails link_to :confirm modal。

标签: ruby cucumber selenium-webdriver page-object-gem


【解决方案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

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

def initialize_page
    disable_popups
end

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

def delete
  disable_popups
  delete_link # => clicks the link
end

参考资料:

【讨论】:

    【解决方案2】:

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

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

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

    例子:

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

    参数:

    • what (bool) — 您希望从确认弹出窗口返回的响应
    • frame(默认为:nil)- 当确认嵌套在框架中时使用的可选参数
    • block — 一个调用会导致显示确认的block

    返回:

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

    警报和提示弹出窗口类似。

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

    class MyPage
      link(:delete_link, :id=>'delete')
    
      def delete()
        confirm(true){ delete_link }
      end
    end 
    

    然后当你调用page.delete时,它会点击链接并确认弹出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 2016-07-24
      • 1970-01-01
      • 2015-09-13
      • 2021-07-14
      相关资源
      最近更新 更多