我有一个场景,其中单击一个按钮后,屏幕上会出现第一个弹出窗口,其中包含“确定”和“取消”按钮。单击第一个弹出窗口的“确定”按钮后,将出现第二个弹出窗口,其中包含“确定”和“取消”按钮。
这里的问题是我无法单击第二个弹出窗口的“确定”按钮。
用于点击的代码如下。第一个弹出的确定按钮点击成功。
browser.button(:text, "Try it").click_no_wait
browser.alert.ok #here first alert ok button is clicked
如果我再次使用browser.alert.ok
作为第二个警报,脚本会挂起
最佳答案
问题
问题似乎在于 Watir-Classic 如何处理等待警报消失的情况。当你执行browser.alert.ok
时,它会点击按钮,然后调用wait_until_not_exists
:
def wait_until_not_exists
Wait.until(3) {!exists?}
@container.page_container.wait
end
此方法等待警报消失,然后浏览器完成加载。
经过一些测试,等待浏览器完成加载似乎并没有考虑到显示的警报。该警报会阻止 Watir 相信页面已加载,因此最终会超时。
解决方法
最好的解决方案可能是更新 Browser#wait 方法。但是,我不确定要更改什么或会产生什么影响。
另一种方法是对 wait_until_not_exists 方法进行猴子修补。这种方法使用较少,因此风险变化可能较低。当需要 Watir-Classic 时,您可以添加以下猴子补丁:
require 'watir-classic'
module Watir
class Alert
def wait_until_not_exists
Wait.until(3) {!exists?}
unless @container.page_container.alert.exists?
@container.page_container.wait
end
end
end
end
这里我们将等待方法更改为仅在没有其他警报存在的情况下等待页面加载。
使用此补丁,您单击两个警报的代码应该可以工作:
browser.alert.ok
browser.alert.ok
关于java - Watir 接连处理多个弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23924765/