2015-12-15 10 views
5

Desidero sovrascrivere il metodo Selenium::WebDriver.for. Questo è quello che ho provato:Come sovrascrivere i metodi di classe

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) 

Ma ho ottenuto l'errore quando si chiama Selenium::Webdriver.for(:phantomjs).

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

Come posso chiamare il metodo originale dal metodo di sovrascrittura?

risposta

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

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

Intelligente, grazie! Ora usiamo questo per modificare 'NewRelic :: Agent :: Hostname.get' con un fallback su super. – Raffael

4

Quando si utilizza self all'interno di un modulo come questo:

def self.for(browser, *args) 

end 

si è dichiarata come module function, non un metodo di istanza della classe che includerà questo modulo. Ciò significa che non apparirà sulle classi incluse quando il modulo è stato mescolato in un'altra classe.

E 'simile alla scrittura:

def SeleniumWebDriverExtension::for 
end 

Quindi, se si desidera chiamare super dall'interno del modulo, dichiarano come un semplice instance method come la risposta accettata ha suggerito. Volevo solo chiarirti il ​​ragionamento alla base di questo.

Btw SeleniumWebDriverExtension.ancestors da cancellare sulla gerarchia dell'ereditarietà.