在页面中,当我点击某个按钮时,我会弹出一个带有“确定”和“取消”按钮的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
请帮忙。提前谢谢。
谢谢, 阿斯温
答案 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对警报的引用消失的情况。