我有一种情况,单击一个按钮后,屏幕上会出现一个带有确定和取消按钮的第一个弹出窗口。单击第一个弹出窗口的“确定”按钮时,第二个弹出窗口带有“确定”和“取消”按钮。

这里的问题是我无法单击第二个弹出窗口的“确定”按钮。

用于点击的代码如下。成功单击第一个弹出的确定按钮。

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


在这里,我们已更改了wait方法,使其仅在没有其他警报时才等待页面加载。

使用此修补程序,单击两个警报的代码应该可以工作:

browser.alert.ok
browser.alert.ok

10-02 04:50