从超类型对象创建ruby对象

时间:2013-03-28 23:46:31

标签: ruby factory subtype

我在Ruby中使用Selenium Webdriver库。典型的代码如下:

require 'rubygems'
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox 
# driver is an instance of Selenium::WebDriver::Driver

url = 'http://www.google.com/'
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
driver.get(url)
wait.until { driver.title.start_with? "Google" }

我想创建一个名为Selenium::WebDriver::Driver的{​​{1}}子类,它将包含一些新方法和实例变量。

如上面的代码所示,创建Selenium::WebDriver::Driver::MyClass实例的方式是Selenium::WebDriver::Driver

如果不批量复制代码,我如何创建与Selenium::WebDriver.for完全相同的Selenium::WebDriver.for版本但创建Selenium::WebDriver.for的实例?

3 个答案:

答案 0 :(得分:0)

为什么不覆盖Selenium::WebDriver.for?让我告诉你我的一个例子

# selenium code
module Selenium
  class WebDriver
    def self.for
      puts "creating oldclass"
    end
  end
end

# your code
class Selenium::WebDriver
  def self.for
    puts "creating myclass"
  end
end

Selenium::WebDriver.for

输出:

creating myclass

安全替代方法是从Selenium::WebDriver派生类并在您的代码中使用它,或者在极端情况下,您只需打开Driver类并向其添加行为。

答案 1 :(得分:0)

检查source codeSelenium::WebDriver.for只需将方法调用委托给Selenium::WebDriver::Driver.for

如果您没有附加监听器,您可以简单地创建自己的网桥MyClass::Bridge.new,然后将其传递给Selenium::WebDriver::Driver.new

如果您坚持覆盖for方法,则可以使用以下代码片段。

module Selenium
  module WebDriver
    class Driver
      class << self
        alias_method :old_for, :for
        def for(browser, opts = {})
          if browser == :myclass
            # create your MyClass::Bridge instance and pass that to new()
          else
            old_for(browser, opts)
          end
        end
      end
    end
  end
end

答案 2 :(得分:0)

如果您只想在驱动程序上定义一些额外的方法,则无需重写WebDriver.for。

以下对我有用:

首先,在文件customdriver.rb

require 'selenium-webdriver'
class CustomDriver < Selenium::WebDriver::Driver 
  #a custom method..
  def click_on (_id)
    element = find_element :id => _id
    element.click
  end 
  #add other custom methods here
  #....
end

然后,在文件main.rb

require-relative 'customdriver'
driver = CustomDriver.for :chrome
driver.click_on("buttonID")

此致