2015-12-15 8 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

चालाक, धन्यवाद! अब हम सुपर के फॉलबैक के साथ 'न्यूरेलिक :: एजेंट :: होस्टनाम.get' में संशोधन करने के लिए इसका उपयोग करते हैं। – Raffael

4

को आप इस तरह एक मॉड्यूल के अंदर self का उपयोग करते हैं:

def self.for(browser, *args) 

end 

यह एक module function, नहीं वर्ग पर एक उदाहरण विधि है कि इस मॉड्यूल शामिल होंगे के रूप में घोषित किया गया है। इसका अर्थ यह है कि मॉड्यूल को किसी अन्य वर्ग में मिश्रित होने पर शामिल कक्षाओं पर दिखाई नहीं देगा।

यह लेखन के समान है:

def SeleniumWebDriverExtension::for 
end 

तो अगर आप मॉड्यूल के भीतर से super कॉल करना चाहते हैं, यह एक साधारण instance method के रूप में घोषित स्वीकार किए जाते हैं जवाब की तरह का सुझाव दिया है। बस इसके पीछे तर्क पर आपको साफ़ करना चाहता था।

बीटीडब्ल्यू SeleniumWebDriverExtension.ancestors विरासत पदानुक्रम पर स्पष्ट होने के लिए।

संबंधित मुद्दे

 संबंधित मुद्दे