无法在Ruby Watir中控制Firefox浏览器中的Javascript弹出窗口

时间:2016-12-11 15:24:02

标签: javascript ruby watir

在页面中,当我点击某个按钮时,我会弹出一个带有“确定”和“取消”按钮的javascript弹出窗口。我想使用Ruby Watir脚本在弹出窗口中单击“确定”按钮。所以我使用以下代码。我收到了FAIL消息,因为javascript弹出窗口在Firefox浏览器中出现并在几分之一秒内消失。因此,为了检查脚本是否捕获了警报,我确实打印了p browser.alert.present?并将其视为错误。如何处理这样的问题?

if (certain_button_click)
    p browser.alert.present? #I get this as 'false'

    browser.wait_until(30) {
        browser.alert.present?
    } rescue nil 

    p browser.alert.present? #I get this as 'false'      

    if browser.alert.present?
        browser.alert.ok
        message = 'Click Ok - PASS'
    else
        message = 'Click Ok - FAIL'
    end
end

请帮忙。提前谢谢。

谢谢, 阿斯温

2 个答案:

答案 0 :(得分:1)

老实说,我无法告诉你在这里想要完成什么,但我知道你的代码在做什么。

每当出现警报时,Selenium会引发UnhandledAlertError,但会对驱动程序采取与警报无关的操作。你的代码正在做的是抢救那个异常(好吧,所有异常,当你知道要避免哪个异常时,你应该避免这样做)。在这方面,Firefox有different behavior而不是Chrome,因为它在引发异常时也会关闭警报。因此,您的代码正在按照您的要求进行操作。

如果您使用Watir 6.0,则不必再指定等待。如果您只想在显示警报时将其解除,则此代码将自动等待警报显示,然后单击“确定”。如果警报从未显示,则会发出超时错误。

element_causing_alert.click
browser.alert.ok

如果您要测试警报是否显示,则可以使用以下代码:

begin
  browser.alert.ok
  true
rescue Watir::Wait::TimeoutError
  false
end

或者,如果您想在超时前指定等待时间:

begin
  browser.alert.wait_until(timeout: 5, &:present?).ok
  true
rescue Watir::Wait::TimeoutError
  false
end

答案 1 :(得分:0)

这是另一个想法。您可以在浏览器中使用execute_script来“截取”警报调用以设置全局变量。然后另一个execute_script检查变量是否已设置。

示例:

def stub_alert
  script = <<-JS
    window.alert = function(){ window.alerted = true }
  JS
  browser.execute_script stub_alert
end

def check_for_alert
  script = <<-JS
    return window.alerted == true
  JS
  browser.execute_script stub_alert
end

Watir在引擎盖下使用了硒,并且有一些关于使用警报的棘手问题。我遇到过如果在处理警报之前运行任何javascript,Selenium对警报的引用消失的情况。