3

我们目前正在使用 watir-webdriver (0.6.2) 和 firefox 来运行验收测试。我们的测试需要很长时间才能运行,并且经常因超时错误而失败。我们想减少超时时间,让他们更快地失败。

我们尝试了:

browser = Watir::Browser.new("firefox")
browser.driver.manage.timeouts.implicit_wait=3 

但是,我们仍然遇到 30 秒超时。

我们找不到有关此问题的任何文档或问题。有谁知道如何正确配置 Watir 等待超时?

4

3 回答 3

5

这完全取决于您所说的“超时”是什么意思。AFAIK 在谈论 Watir-Webdriver 时,通常会讨论三种不同的超时定义:

  1. 浏览器等待页面加载多长时间?
  2. 当通过“.when_present”函数告知要等待时,Watir-Webdriver 在考虑元素“不存在”或“不可见”之前显式等待多长时间
  3. Watir-Webdriver在考虑元素“不存在”或“不可见”之前隐式等待对象出现多长时间(当不通过显式调用等待时,请参阅 #2)

#1:页面加载

Justin Ko 是正确的,如果您的目标是修改它,您可以按照描述设置页面加载超时,尽管看起来规范的方法是在创建浏览器之前设置客户端超时并在创建时将其传递给浏览器:

client = Selenium::WebDriver::Remote::Http::Default.new
client.timeout = 180 # seconds – default is 60

b = Watir::Browser.new :firefox, :http_client => client

- Alistair Scott,“如何在 Watir-Webdriver 中更改页面加载超时”

#2:显式超时

但我认为@p0deje 说您正在经历明确的超时是正确的,尽管在没有看到您的代码的情况下无法肯定地说。在下面,我经历了显式声明覆盖了隐式声明(我不确定这是否是故意的):

b = Watir::Browser.new :firefox
b.driver.manage.timeouts.implicit_wait = 3 
puts Time.now #=> 2013-11-14 16:24:12 +0000
begin
  browser.link(:id => 'someIdThatIsNotThere').when_present.click
rescue => e
  puts e #=> timed out after 30 seconds, waiting for {:id=>"someIdThatIsNotThere", :tag_name=>"a"} to become present
end
puts Time.now #=> 2013-11-14 16:24:43 +0000

由于“when_present”,Watir-Webdriver 默认会在失败前等待 30 秒。或者,您可以说“when_present(10)”来更改默认值并等待 10 秒。(Watir-Webdriver > Watir::Wait#when_present。)我无法在全球范围内预测任何方法。除非你找到这样的东西——如果你找到了请告诉我——必须在每次通话时完成。:(编辑:回复者 Justin Ko 给了我关于如何执行上述操作的答案编辑 2 : @jarib 将此添加到 Watir 中,根据链接答案中的@justinko :“更新:此猴子补丁已合并到在 watir-webdriver v0.6.5 中不再需要 watir-webdriver 等。您将能够使用以下方法设置超时:Watir.default_timeout = 90"

#3 隐式超时

您提供的代码设置了 Watir-Webdriver 等待任何元素出现的时间,而无需您明确说明:

b = Watir::Browser.new :firefox
b.driver.manage.timeouts.implicit_wait = 3 
puts Time.now #=> 2013-11-14 16:28:33 +0000
begin
  browser.link(:id => 'someIdThatIsNotThere').when_present.click
rescue => e
  puts e #=> unable to locate element, using {:id=>"someIdThatIsNotThere", :tag_name=>"a"}
end
puts Time.now #=> 2013-11-14 16:28:39 +0000
于 2013-11-14T16:35:21.110 回答
3

implicit_wait是 selenium-webdriver 在超时之前尝试查找元素的时间量。默认值为 0 秒。通过将其更改为“3”,您实际上是在增加它将等待的时间。

我猜您实际上想要更改等待页面加载的超时时间(而不是查找元素)。这可以通过以下方式完成:

browser.driver.manage.timeouts.page_load = 3

例如,我们可以说加载 Google 时只等待 0 秒:

require 'watir-webdriver'
browser = Watir::Browser.new :firefox
browser.driver.manage.timeouts.page_load = 0
browser.goto 'www.google.ca'
#=> Timed out waiting for page load. (Selenium::WebDriver::Error::TimeOutError)
于 2013-06-21T21:43:32.800 回答
1

更新:从Watir 6.5 开始,默认超时可以使用

Watir.default_timeout = 3

我们遇到了同样的问题并选择覆盖涉及超时的 Watir 方法,即

  • Watir::Wait.until { ... }
  • Watir::Wait.while { ... }
  • object.when_present.set
  • object.wait_until_present
  • object.wait_while_present

这是代码,您可以将其放入您的spec_helper.rbif 使用rspec

# method wrapping technique adapted from https://stackoverflow.com/a/4471202/177665
def override_timeout(method_name, new_timeout = 3)
  if singleton_methods.include?(method_name)
    old_method = singleton_class.instance_method(method_name)

    define_singleton_method(method_name) do |timeout = new_timeout, *args, &block|
      old_method.bind(self).(timeout, *args, &block)
    end
  else
    old_method = instance_method(method_name)

    define_method(method_name) do |timeout = new_timeout, *args, &block|
      old_method.bind(self).(timeout, *args, &block)
    end
  end
end

# override default Watir timeout from 30 seconds to 3 seconds
module Watir
  module Wait
    override_timeout(:until)
    override_timeout(:while)
  end

  module EventuallyPresent
    override_timeout(:when_present, 5) # 5 secs here
    override_timeout(:wait_until_present)
    override_timeout(:wait_while_present)
  end
end

我们使用来自https://stackoverflow.com/a/44712​​02/177665的答案来让它工作。

于 2013-11-18T11:11:42.423 回答