1

watir-classic gem では、Element クラスの下に generate_ruby_code() というメソッドがあります。モンキーパッチを適用して、いくつか変更したいと思います。

私がしたことは次のとおりです。

MyFile.rb


require 'watir-classic'
module Watir
    class Element
        def generate_ruby_code(element, method_name, *args)
            puts "Print this"
        end
    end
end

しかし、モンキー パッチを適用したメソッドを呼び出す代わりに、Element クラスの元の generate_ruby_code が毎回呼び出されますが、これは望ましくありません。

この問題を解決するために私を助けてください。

4

2 に答える 2

2

問題

watir-classic v3.7.0 以前を使用していると仮定します。

これらのバージョンでは、実行require 'watir-classic'してもすべてのクラスがすぐにはロードされません。Watir::Element を含む一部のクラスは、ブラウザー インスタンスが作成されるまで読み込まれません。

この意味は:

# Does not create Watir::Element#generate_ruby_code yet
require 'watir-classic'

# You create a Watir::Element#generate_ruby_code method
module Watir
    class Element
        def generate_ruby_code(element, method_name, *args)
            puts "Print this"
        end
    end
end

# Watir loads the Watir::Element#generate_ruby_code, which overrides yours
browser = Watir::Browser.new

私の理解では、これは watir-classic が以前に複数のブラウザー (つまり、FireWatir と SafariWatir) をサポートしていたためです。使用されているブラウザに基づいて、さまざまなクラスが自動ロードされました。

解決策 1 - v4.0 以降にアップグレードする

最も簡単な解決策は、watir-classic を v4.0 以降 (現在の最新バージョンは 4.0.1) にアップグレードすることです。

このバージョンではオートローディングが削除されました。つまり、コードはそのまま動作します。

解決策 2 - 最初にブラウザを初期化する

アップグレードができない場合は、モンキー パッチを適用する前に手動で自動ロードを強制する必要があります。これは、定数を次のように参照するだけで実行できます。

Watir::IE

これは、watir-classic を要求した後、monkey パッチを適用する前に、単純に含めてください。

require 'watir-classic'
Watir::IE # this will load the code

module Watir
    class Element
        def generate_ruby_code(element, method_name, *args)
            puts "Print this"
        end
    end
end

browser = Watir::Browser.new
browser.goto 'www.google.ca'
browser.link.click_no_wait
#=> "Print this"
于 2013-10-30T11:18:46.017 に答える