我有一个页面,如果加载太慢,我想提出错误。 是否有一些方法 Watir 类似于 Watir-Webdriver &#39>:
client = Selenium::WebDriver::Remote::Http::Default.new
client.timeout = 10
@browser = Watir::Browser.new :firefox, http_client: client
答案 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)
您可以将超时值放入变量中,以便可以动态更改。