重新打开Ruby类的奇怪问题

时间:2011-02-04 02:18:24

标签: ruby classloader watir

我正在与Watir和Watir-WebDriver同时工作,并试图通过重新打开一些类并重新定义一些方法来使它们更兼容。我遇到了一些我无法解释的怪异行为。我正在努力了解发生了什么。

这种情况发生在watir-1.7.1上,只能在Windows上使用 Ruby 1.8.7-p330
RUBYOPT = -rubygems

测试1。

require 'watir'

Watir::ElementCollections.class_eval do
  def new_method
  end
end

>ruby open-classes-watir1.rb
open-classes-watir1.rb:3: uninitialized constant Watir::ElementCollections (NameError)

为什么Ruby抱怨重新开放有效的课程?

有问题的课程如下:

element_collections.rb:

module Watir
   #... 
  class ElementCollections
    include Enumerable
    #...
  end
end

但这不是全部!现在看这个:

测试2。

require 'watir'

Watir::IE.class_eval do
end

Watir::ElementCollections.class_eval do # Requires the magic incantation above
  def new_method
  end
end

>ruby open-classes-watir2.rb

现在这个黑魔法咒语执行得很好。 Watir :: IE看起来像这样:

ie-class.rb:

module Watir
  class IE
    include WaitHelper
    include Exception
    include Container
    include PageContainer
    #...
  end
end

为什么?

3 个答案:

答案 0 :(得分:2)

我在此前做了一个视觉帮助。 http://www.flickr.com/photos/marekj/3615299778/ require'watir'来自commonwatir gem 要求'watir / ie'来自watir gem。 这里有两颗宝石在玩。

答案 1 :(得分:1)

我怀疑通过调用lib/watir/element_collections.rb未加载定义Watir::ElementCollections的文件require 'watir'lib/watir/ie.rb需要lib/watir/core.rb,而lib/watir/element_collections.rb需要{{1}}。

试试这个:

require 'watir'
require 'watir/core'

Watir::ElementCollections.class_eval do
  def new_method
  end
end

答案 2 :(得分:1)

这种情况正在发生,因为require "watir"尚未实际加载Watir::IE。在执行Watir::IE时,Kernel.autoload会加载Watir::Browser.new。这是如何使它工作:

require "watir"
Watir::IE # to trigger autoload

# now Watir::ElementCollections exists

根据史蒂夫的建议,其他解决方案将是require "watir/core"