今天第二篇非常重要,基本是每一个QAD在编写WATIR脚本的时候会遇到的问题,它和前端开发密切相关,本篇主要和大家分享获取浏览器的状态和获取后如何等待!
文件位置:watir-1.8.0\lib\watir\ie-class.rb
接上一篇,大家在goto函数中看到了wait这个函数,可是具体实现大家并不是很清楚。接下来就是主要内容啦!
1st. 浏览器的状态有哪些
0 - (未初始化/Uninitialized)还没有调用send()方法
1 - (载入/Loading)已调用send()方法,正在发送请求
2 - (载入完成/(Loaded)send()方法执行完成,已经接收到全部响应内容
3 - (交互/Interactive)正在解析响应内容
4 - (完成/Completed)响应内容解析完成,可以在客户端调用了
哈哈,大家都知道了吧,而watir认为当浏览器状态为4时,才算当前页面已经加载完毕,但有的时候我们想让它在载入完成后但还没有解析内容的时候就立刻停止等待,那接下来就细细的品味一下wait函数的魅力!
先上代码:
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
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
这个函数的超时设置是在下面的语句设置的,也就是说,最多等页面加载5分钟,大家可以修改这里
Timeout::timeout(5*60) do
函数的返回值是
@down_load_time
函数的主要功能如下:
当在5分钟内不断执行以下内容
1)浏览器是不处于忙状态,若是,则每次等待interval长度的时间,再继续检查,知道浏览器不忙状态时跳出
2)等待浏览器状态为READYSTATE设置的状态码,若当前状态不是指定的READYSTATE状态码,则等待interval长度的时间,再继续检查,知道浏览器状态为READYSTATE设置的状态码
3)检查是否获取到了浏览器的document 对象,若未获得,也等待interval长的时间。
4)最后将document对象赋值给documents_to_wait_for
注意下面这条语句
documents_to_wait_for = [@ie.document]
InternetExploere.Application 的document方法返回的是一个数组,那因此应该用一个数组来接收!!那么documents_to_wait_for就是一个数组啦!那接下来的代码就不难读啦!
我们对每一个document进行如下处理
1)判断当前这个document的状态是否为READYSTATE设置的状态
2)若该document中又包含几个frame,则将frame中的document进行追加
矮油!到这里一些小童鞋就有疑问了,这神马@ie.busy和@ie.readyState是从哪里来的,在IRB里面调试为神马不能用ie=Watir::IE.new,ie.readyState获得当前状态呢??
其实这些方法都是通过WIN32OLE调用InternetExplorer.Application中的函数呀!
有好事者就就问啦!这些函数哪里找??其实第一篇的时候我已经给过一些了,但是给的很少很少!
这里就将所有的函数给大家,供大家学习!!
InternetExplorer.Application方法介绍
http://msdn.microsoft.com/en-us/library/aa752084%28v=vs.85%29.aspx
为了方便在IRB下调试,我建议在ie-class.rb中增加一个public属性的函数
# added by Robin
def getIe
@ie
end
这样你就可以很方便的在IRB下调试啦,而且可以应用在你的case里!
举例:
ie=Watir::IE.new
ie.goto 'image.baidu.com'
ole=ie.getIe
p ole.readyState
p ole.busy
是不是很好用哇!
有关IE的一些基本函数我就不再多讲了,大家可以参考MSDN和WATIR REFERENCE就可以知道一些方法的用法了,没有必要再去细读这些方法如何实现,因为都比较表面,以后的几篇主要讲讲WATIR中的JS执行和一些类似于onMouseHover这样的函数如何调用,更多的讲一讲它到底是如何定位一个元素的!
I'm Robin , 如果需要自动化测试,请联系QQ:252413619