ruby中几个类库文件的调用过程

上一篇 / 下一篇  2008-12-08 21:00:33 / 个人分类:Ruby

使用Watir的提供出来的几个方法比较简单,但是如果要了解这些方法的调用过程,还是需要花一定时间的。这里根据淘宝登录页面中的帐户名输入为例,说明下几个类库文件的调用过程,源码如下:
---------------------------------------------------------
require 'watir'
ie = Watir::IE.new
urlsite = 'http://member1.taobao.com/member/login.jhtml?ssl=false&f=top&redirect_url=http%3A%2F%2Fwww.taobao.com%2F'
ie.goto(urlsite)
ie.text_field(:id,"TPL_username").set "baoju"
----------------------------------------------------------
最简单的了解调用过程就是调试,但是对于ruby来说,现在好多ide还不支持调试,因此选择一款好的IDE也是比较重要的,我这里选择的是NetBeans6.5,一些调试方法,code complete等一些常用方法都已经有了,这里分析一下ie.text_field(:id,"TPL_username").set "baoju"  这句话的调用过程。

首先查找Watir::IE类中的text_field方法,但是Watir::IE类中没有这个方法,由此到Container中查找text_field方法:
 def text_field(how, what=nil)
      TextField.new(self, how, what)
 end
这个方法实现了TextField的初始化,调用TextField类,由于这个类的 initialize 方法在父类中实现,所以调试时直接跳到了类InputElement的initialize方法,代码如下:
--------------------------------------------------------
def initialize(container, how, what)
      set_container container
      @how = how
      @what = what
      super(nil)
    end
---------------------------------------------------------
到此为止ie.text_field(:id,"TPL_username")执行完成,现在要做的是set方法,方法定义如下:
------------------------------------------------------------------------
def set(value)
      assert_enabled
      assert_not_readonly
     
      highlight(:set)
      @o.scrollIntoView
      if type_keys
          @o.focus
          @o.select
          @o.fireEvent("onSelect")
          @o.fireEvent("onKeyPress")
          @o.value = ""
          type_by_character(value)
          @o.fireEvent("onChange")
          @o.fireEvent("onBlur")
        else
                @o.value = limit_to_maxlength(value)
        end
      highlight(:clear)
    end
--------------------------------------------------------------------------
先调用 assert_enabled 方法,这个方法在父类Element(element.rb)中实现
-----------------------------------------------------------
  def assert_enabled
      unless enabled?
        raise ObjectDisabledException, "object #{@how} and #{@what} is disabled"
      end
    end
-------------------------------------------------------------
这个方法中又调用了enabled? 方法,当没有时,就返回一个错误
enabled? 的方法定义为:
------------------------------------------------------------
def enabled?
      assert_exists
      return ! disabled
    end
------------------------------------------------------------
这里又调用了assert_exitsts方法
assert_exists的方法为:
-------------------------------------------------------------
 def assert_exists
      locate if defined?(locate)
      unless ole_object
        raise UnknownObjectException.new(
          Watir::Exception.message_for_unable_to_locate(@how, @what))
      end
    end
---------------------------------------------------------------
这里调用了locate方法,locate的实现为:
 def locate
      @o = @container.locate_input_element(@how, @what, self.class::INPUT_TYPES)
   end
这里又调用了locate_input_elemen方法:
-------------------------------------------------------------------------
 def locate_input_element(how, what, types, value=nil)
      case how
      when :xpath
        return element_by_xpath(what)
      when :ole_object
        return what
      end
      # else:
     
      locator = InputElementLocator.new self, types
      locator.specifier = [how, what, value]
      locator.document = document
      return locator.element if locator.fast_locate
      # todo: restrict search to elements.getElementsByTag('INPUT'); faster
      locator.elements = ole_inner_elements if locator.elements.nil?
      locator.locate
    end
--------------------------------------------------------------------------------------

这里返回具体元素,当元素有时,就定位到了元素,然后通过set下面的赋值来完成赋值操作。


TAG: 测试工具 Ruby

 

评分:0

我来说两句

Open Toolbar