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

无法在Ruby Watir中控制Firefox浏览器中的Javascript弹出窗口,javascript,ruby,watir,Javascript,Ruby,Watir,在一个页面中,当我点击某个按钮时,我会看到一个带有“Ok”和“Cancel”按钮的javascript弹出窗口。我想使用Ruby Watir脚本在弹出窗口中单击“Ok”按钮。所以我使用下面的代码。我收到失败消息,因为javascript弹出窗口在Firefox浏览器中在几秒钟内出现和消失。因此,为了检查脚本是否捕捉到警报,我打印了p browser.alert.present?,结果显示为false。如何处理这样的问题? if (certain_button_click) p brows

在一个页面中,当我点击某个按钮时,我会看到一个带有“Ok”和“Cancel”按钮的javascript弹出窗口。我想使用Ruby Watir脚本在弹出窗口中单击“Ok”按钮。所以我使用下面的代码。我收到失败消息,因为javascript弹出窗口在Firefox浏览器中在几秒钟内出现和消失。因此,为了检查脚本是否捕捉到警报,我打印了
p browser.alert.present?
,结果显示为false。如何处理这样的问题?

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
请帮忙。提前谢谢

谢谢,
阿什温

这里有另一个想法。您可以在浏览器中使用
execute\u script
,该浏览器将“删除”警报调用以设置全局变量。然后另一个
execute\u脚本
,检查变量是否已设置

例如:

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
def存根_警报

script=老实说,我不知道您在这里试图完成什么,但我看到了您的代码在做什么

无论何时出现警报,Selenium都会引发一个
未处理的警报恐怖
,但会对驱动程序执行一个与警报无关的操作。您的代码所做的是拯救该异常(好吧,所有异常,当您知道要避免哪个异常时,应该避免这样做)。Firefox在这方面比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

我在回答中描述了你所目睹的行为的原因。对于无法通过Selenium API完成的警报,您试图做什么?一般来说,我建议不要使用javascript变通方法,除非这是绝对的最后手段。如果真的需要测试用例与警报交互,比如输入文本,那么selenium api当然是最好的选择。但只说“是否发出警报?”更简单,而且不需要了解警报处理的详细信息。在Watir中,有
browser.alert.present?
提供该功能。我们只需就javascript代码的简单性达成一致意见即可@titusfortner Selenium的警报处理系统在我看来仍有改进的余地。例如,如何区分警报/确认/提示。另外,how
unhandledarterror
关闭警报,该警报可能是未解除的。如果不是因为这些东西,我就不会那么热衷于推荐使用W3C来取代Selenium 4,因为W3C应该使它在浏览器之间更加标准化()。请注意,geckodriver现在有一个bug,它从未抛出该错误。此外,Firefox和IE都允许通过设置功能(意外的警报行为)自动解除警报,这在W3C中也将得到支持。如果您认为能够区分不同类型的警报是重要的,那么您应该用W3C提出一个问题。