兆鹏带你读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


原创粉丝点击