如何在Watir中设置默认页面加载超时?

时间:2014-12-06 09:12:46

标签: timeout watir

我有一个页面,如果加载太慢,我想提出错误。 是否有一些方法 Watir 类似于 Watir-Webdriver &#39>:

client = Selenium::WebDriver::Remote::Http::Default.new
client.timeout = 10
@browser = Watir::Browser.new :firefox, http_client: client

1 个答案:

答案 0 :(得分:2)

Watir-Classic没有用于控制等待页面加载时间的API。

点击链接或使用goto方法时,会调用Browser#wait方法。这将阻止执行,直到加载页面。如果页面在5分钟内未加载,则硬编码为超时:

def wait(no_sleep=false)
  @xml_parser_doc = nil
  @down_load_time = 0.0
  interval = 0.05
  start_load_time = ::Time.now

  Timeout::timeout(5*60) do
    ...
end

解决方案1 ​​ - 使用超时

如果您只需要为少数情况更改超时,最简单的选项可能是使用超时库。

例如,www.cnn.com需要9秒钟才能加载到我的电脑上。但是,要仅等待最多5秒,您可以将goto(或click)方法包装在额外的超时中:

Timeout::timeout(5) do
  browser.goto 'www.cnn.com'
end
#=> execution expired (Timeout::Error)

解决方案2 - Monkey patch Browser#wait

如果要将更改应用于所有页面,可以覆盖Browser#wait方法以使用不同的超时。例如,将其覆盖仅为5秒:

require 'watir-classic'

module Watir
  class Browser
    def wait(no_sleep=false)
      @xml_parser_doc = nil
      @down_load_time = 0.0
      interval = 0.05
      start_load_time = ::Time.now

      # The timeout can be changed here (it is in seconds)
      Timeout::timeout(5) do
        begin
          while @ie.busy
            sleep interval
          end

          until READYSTATES.has_value?(@ie.readyState)
            sleep interval
          end

          until @ie.document
            sleep interval
          end

          documents_to_wait_for = [@ie.document]
        rescue WIN32OLERuntimeError # IE window must have been closed
          @down_load_time = ::Time.now - start_load_time
          return @down_load_time
        end

        while doc = documents_to_wait_for.shift
          begin
            until READYSTATES.has_key?(doc.readyState.to_sym)
              sleep interval
            end
            @url_list << doc.location.href unless @url_list.include?(doc.location.href)
            doc.frames.length.times do |n|
              begin
                documents_to_wait_for << doc.frames[n.to_s].document
              rescue WIN32OLERuntimeError, NoMethodError
              end
            end
          rescue WIN32OLERuntimeError
          end
        end
      end

      @down_load_time = ::Time.now - start_load_time
      run_error_checks
      sleep @pause_after_wait unless no_sleep
      @down_load_time
    end
  end
end

browser.goto 'www.cnn.com'
#=> execution expired (Timeout::Error)

您可以将超时值放入变量中,以便可以动态更改。