2015-12-15 14 views
5

Ich möchte die Methode Selenium::WebDriver.for überschreiben. Das ist, was ich versucht:So überschreiben Klassenmethoden

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) 

Aber ich habe Fehler beim Selenium::Webdriver.for(:phantomjs) genannt wird.

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

Wie kann ich die ursprüngliche Methode von der übergeordneten Methode aufrufen?

Antwort

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

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

Clever, danke! Wir verwenden dies nun, um 'NewRelic :: Agent :: Hostname.get' mit einem Fallback auf 'super' zu ändern. – Raffael

4

Wenn Sie self innerhalb eines Moduls wie folgt verwenden:

def self.for(browser, *args) 

end 

es als module function deklariert wird, nicht eine Instanz Methode für die Klasse, die dieses Modul enthalten wird. Dies bedeutet, dass es nicht in eingeschlossenen Klassen erscheint, wenn das Modul in eine andere Klasse gemischt wird.

Es ist ähnlich dem Schreiben:

def SeleniumWebDriverExtension::for 
end 

Also, wenn Sie super von innerhalb des Moduls, erklären sie als einfaches instance method wie die akzeptierte Antwort vorgeschlagen hat, die angerufen werden soll. Ich wollte dich nur über die Gründe dafür aufklären.

Btw SeleniumWebDriverExtension.ancestors, um in der Vererbungshierarchie klar zu sein.