2015-12-15 493 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',並使其回退到超級。 – Raffael

4

當你使用一個self模塊內部是這樣的:

def self.for(browser, *args) 

end 

它被聲明爲module function,而不是通過類的實例方法,將包括該模塊。這意味着當模塊混入另一個類時,它將不會出現在包含的類中。

它類似於寫作:

def SeleniumWebDriverExtension::for 
end 

所以,如果你想打電話super從模塊中,聲明它作爲一個簡單的instance method喜歡接受的答案已經建議。只是想清楚你背後的理由。

btw SeleniumWebDriverExtension.ancestors在繼承層次結構上是明確的。