2015-12-15 28 views
5

Selenium::WebDriver.for yöntemini geçersiz kılmak istiyorum.Sınıf yöntemleri nasıl geçersiz kılın

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) 

Ama Selenium::Webdriver.for(:phantomjs) çağrıldığında ben hata var: Bu denedim budur.

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

Geçersiz kılma yönteminden orijinal yöntemi nasıl çağırabilirim?

cevap

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

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

Zeki, teşekkürler! Şimdi bunu, NewRelic :: Agent :: Hostname.get 'i süper için bir geri dönüş ile değiştirmek için kullanıyoruz. – Raffael

4

Böyle bir modül içinde self zaman kullanılır

def self.for(browser, *args) 

end 

bir module function değil, bu modülü içerecek sınıfının bir örnek yöntemi olarak ilan edilir. Bunun anlamı, modül başka bir sınıfa karıştırıldığında dahil edilen sınıflarda görünmez.

Bu yazı benzer: Kabul yanıt önerdi gibi

def SeleniumWebDriverExtension::for 
end 

Yani modül içinden super aramak istiyorsanız, basit instance method olarak ilan. Sadece bunun arkasındaki mantık konusunda seni temizlemek istedim. Kalıtım hiyerarşisinde açık olması için .

İlgili konular