使用watir-webdriver等待js警报

时间:2012-02-15 10:22:36

标签: watir-webdriver

我正在使用watir-webdriver来驱动Web应用程序的测试运行。

有问题的页面通过确认响应输入更改,然后是页面流失,然后是警报。

**更新**

我尝试过以下操作但是我从确认块开始Selenium::WebDriver::Error::UnhandledAlertError

require "watir-webdriver/extensions/alerts"

b.alert do
  b.confirm(true) do
    b.checkbox(:index => 1).set
  end
end

** END UPDATE **

但是添加以下内容(输入更改后):

browser.driver.switch_to.alert.accept

将解雇第一个确认没问题...

不幸的是,由于页面流失尝试使用相同的行来解除以下警报,因此会引发

Selenium::WebDriver::Error::NoAlertPresentError

因为警报尚未发生。

我的解决方法是将以下方法添加到Watir :: Browser

def get_alert (timeout = 300)
  Watir::Wait.until(timeout) {
    begin
      driver.switch_to.alert
    rescue Selenium::WebDriver::Error::NoAlertPresentError
    end
  }
end

并通过

运行所有警报处理
browser.get_alert

有没有更好/内置的方式来做到这一点?

**更新**

我的解决方法的一个好处是它允许我在程序上处理警报,而不是在b.alert / b.confirm中更难读取(或生成)块

** END UPDATE **

提前致谢, 阿瑟

3 个答案:

答案 0 :(得分:2)

根据watir-webdriver网站上的dialogs页面 - >

require "watir-webdriver/extensions/alerts"

browser.confirm(true) do
  browser.button(:value => 'Confirm').click
end #=> 'the confirm message'

因此,在您的具体情况下,您应该可以调用上述内容,而不是致电browser.driver.switch_to.alert.acceptbrowser.get_alert

希望这有帮助。

答案 1 :(得分:0)

很难知道这是否可以在没有访问您的网页的情况下进行尝试,但您是否考虑尝试这样的事情?

require "watir-webdriver/extensions/alerts"

b.alert do
  b.checkbox(:index => 1).set
  browser.driver.switch_to.alert.accept
  #possibly a wait here...
end

答案 2 :(得分:0)

较新的Alerts API具有标准等待方法,因此您现在可以执行以下操作:

browser.alert.when_present.ok