2011-02-04 18 views
2

私はWatirとWatir-WebDriverと同時に作業しており、いくつかのクラスを再オープンし、いくつかのメソッドを再定義することにより、それらをより互換性のあるものにしようとしています。私は私が説明できない奇妙な行動に遭遇した。私は何が起こっているのか理解しようとしています。Rubyクラスを再オープンする際の奇妙な問題

これはWindowsでのみ利用可能なwatir-1.7.1で発生しています。
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 

なぜですか?

答えて

2

私はこれを視覚的に補助しました。 http://www.flickr.com/photos/marekj/3615299778/ require 'watir'はcommonwatirの宝石から来ます 'watir/ie'はwatirの宝石から来ます。 ここには2つの宝石があります。

+1

私は "watir/ie"を必要とします。 –

+0

'watir/element_collections'も必要です – DKroot

1

を定義するファイルlib/watir/element_collections.rbがロードされていないと思われる場合は、require 'watir'を呼び出してください。 lib/watir/ie.rblib/watir/core.rbを必要とし、順にlib/watir/element_collections.rbが必要です。

これを試してみてください:

require 'watir' 
require 'watir/core' 

Watir::ElementCollections.class_eval do 
    def new_method 
    end 
end 
+0

require 'watir/core'は問題を解決しません。同じエラーが出ます。どうしてか分かりません。 'watir/element_collections'が必要です。 – DKroot

1

require "watir"はまだ実際にWatir::IEをロードしていないので、これが起こっています。 Watir::IEWatir::Browser.newを実行するとKernel.autoloadによってロードされます。スティーブによって示唆されているように

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

# now Watir::ElementCollections exists 

他のソリューションはrequire "watir/core"に次のようになります。これは、それを動作させる方法です。

+0

はい、うまくいきますが、コードがぼんやりしています。私は追加を選択しました:require 'watir/element_collections' – DKroot