2015-12-15 18 views
5

メソッドSelenium::WebDriver.forをオーバーライドしたいと思います。クラスメソッドをオーバーライドする方法

module SeleniumWebDriverExtension 
    def self.for(browser, *args) 
    if browser != :phantomjs 
     super(browser, *args) 
    else 
     options = { 
      "phantomjs.cli.args" => ["--ssl-protocol=tlsv1"] 
     } 
     capabilities = Selenium::WebDriver::Remote::Capabilities.phantomjs(options) 
     super(browser, desired_capabilities: capabilities) 
    end 
    end 
end 

Selenium::WebDriver.prepend(SeleniumWebDriverExtension) 

しかしSelenium::Webdriver.for(:phantomjs)が呼び出されたとき、私はエラーを得た:これは私が試したものです。

NoMethodError: super: no superclass method `for' for Selenium::WebDriver::Driver:Class 

オーバーライド方法から元のメソッドを呼び出す方法はありますか。

答えて

9
module SeleniumWebDriverExtension 
    def for(browser, *args) 
    ... 
    end 
end 

Selenium::WebDriver.singleton_class.prepend(SeleniumWebDriverExtension) 
+1

賢い、ありがとう!これを使って 'NewRelic :: Agent :: Hostname.get'を修正し、superへのフォールバックを行います。 – Raffael

4

あなたにはこのようなモジュール内selfを使用します。

def self.for(browser, *args) 

end 

それはmodule function、ないこのモジュールが含まれたクラスのインスタンスメソッドとして宣言されています。これが意味することは、モジュールが別のクラスに混在しているときに含まれるクラスには表示されないということです。

これは、書き込みのようになります。

ので
def SeleniumWebDriverExtension::for 
end 

あなたは受け入れ答えのような単純なinstance methodを示唆しているとして、それを宣言し、モジュール内からsuperを呼び出したい場合。この背後にある理由について、あなたに明確にしたいだけでした。

Btw SeleniumWebDriverExtension.ancestorsは継承階層で明確になります。

関連する問題