兆鹏带你读Watir——【第二篇】浏览器状态及线程等待
来源:互联网 发布:java 路由器端口扫描 编辑:程序博客网 时间:2024/04/28 02:12
今天第二篇非常重要,基本是每一个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.newie.goto 'image.baidu.com'ole=ie.getIep ole.readyStatep ole.busy是不是很好用哇!
有关IE的一些基本函数我就不再多讲了,大家可以参考MSDN和WATIR REFERENCE就可以知道一些方法的用法了,没有必要再去细读这些方法如何实现,因为都比较表面,以后的几篇主要讲讲WATIR中的JS执行和一些类似于onMouseHover这样的函数如何调用,更多的讲一讲它到底是如何定位一个元素的!
I'm Robin , 如果需要自动化测试,请联系QQ:252413619
- 兆鹏带你读Watir——【第二篇】浏览器状态及线程等待
- 兆鹏带你读watir——【第五篇】watir的js应用(技巧篇)
- 兆鹏带你读watir——浅谈基于watir的前端敏捷测试
- 兆鹏带你读Watir——【第一节】创建IE对象篇
- 兆鹏带你读watir——【第三篇】元素定位的过程
- 兆鹏带你读watir——【第四篇】元素定位的细节
- 多线程基础知识第二篇:线程常用方法及各种状态
- 线程进入等待状态
- Java线程系列(2)——线程有限等待状态分析
- 乙醇教你读watir源码(0)——写在前面
- Java线程的等待状态
- iOS开发多线程篇—NSThread及线程的状态
- java再复习——线程的状态以及等待唤醒机制
- 第二部分 线程的等待和唤醒
- 第二部分 线程的等待和唤醒
- 线程进入等待状态有几种方式?
- 利用信号量使线程进入等待状态
- watir——上传文件
- 微分方程在建模中的应用(建立差分模型)
- 索引信息
- Linux守护进程的编程方法
- 部分代码
- Linux程序设计入门--信号处理
- 兆鹏带你读Watir——【第二篇】浏览器状态及线程等待
- C语言结构体
- linux下配置ip地址
- Linux程序设计入门--线程操作
- js多文件上传框
- vs2010 连接vss2005源码管理器
- Linux实用操作日记
- oracle 存储过程语句总结
- MySQL 性能提示