使用“exists”watir-webdriver方法时出现超时错误

时间:2013-01-17 10:14:51

标签: ruby firefox watir watir-webdriver

就搜索而言,我无法找到支持watir的浏览器的最新列表。

我刚刚将firefox升级到版本18,在此期间,还将watir-webdriver版本更新为最新版本(使用gem update watir-webdriver)。

到目前为止,我遇到过一个问题,我似乎无法找到解决方案。

当我尝试检查元素是否存在时,可以说使用$browser.a(:href, "#{$url}/admin/").exists?$url变量被定义为我的测试服务器的主URL,所以这不是问题所在。此外,甚至当我用实际地址替换变量时,我仍然遇到同样的问题),当元素存在时,我总是会收到超时错误。

当元素存在时,我会得到true的即时回复。因此,仅当元素存在时才会发生超时问题。

所以我的问题是:

  1. 有没有办法让.exists?方法有效?
  2. 有没有人知道任何其他类似的问题与最新版本的Firefox(V.18)?
  3. 如果有人能指出我更新的watir支持的浏览器列表,我真的很感激。最好是定期更新的列表。
  4. P.S, 我确实看到有人发布了关于present?方法的问题,我不知道它是否相关,但尽管如此,我仍然没有解决方案。我不想降级到以前版本的ff。

    感谢所有愿意提供帮助的人,

    亲切的问候, 阿萨夫。

1 个答案:

答案 0 :(得分:0)

我在这里和那里遇到了这样的问题,解决方法是捕获异常并重新运行触发此异常的代码片段。当然,我假设您的异常是由某些瞬态原因触发的,可能是由于Watir中的故障。

简而言之,你可以这样做:

begin
  $browser.a(:href, "#{$url}/admin/").exists?
rescue Timeout::Error
  puts("Caught a TIMEOUT ERROR!")
  sleep(1)
  # Retry the sode that generates the esception.
  retry
end

这是最简单的形式。您还可以通过执行以下操作确保不要将自己锁定在无限循环中:

retries_left = 3
begin
  $browser.a(:href, "#{$url}/admin/").exists?
rescue Timeout::Error
  puts("Caught a TIMEOUT ERROR!")

  # You may want to wait for a while before retrying.
  sleep(1)

  # Retry the code that generates the exception.
  retries_left -= 1
  retry if retries_left > 0

  # No more retries left - time to bail out! Re-raise the exception.
  raise
end

你可以通过将这个异常处理代码抽象为一个测试助手方法来改进这一点,该方法接受块并以更清晰的方式使用它,而不必重复自己,如:

handle_transient_exceptions {
  $browser.a(:href, "#{$url}/admin/").exists?
}

但这不是你问的问题。 :)

参考你的第三个问题,我可以说watir-webdriver很好地支持最新的Chrome,Firefox和IE9。我目前正在使用这些浏览器,但尚未发现任何阻塞问题。