兆鹏带你读Watir——【第二篇】浏览器状态及线程等待

今天第二篇非常重要,基本是每一个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


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值