我正在与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
为什么?
答案 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"
。