从超类型对象创建ruby对象

从超类型对象创建ruby对象,ruby,factory,subtype,Ruby,Factory,Subtype,我正在使用Ruby中的SeleniumWebDriver库。一段典型的代码如下所示: 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::W

我正在使用Ruby中的SeleniumWebDriver库。一段典型的代码如下所示:

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
,名为
Selenium::WebDriver::Driver::MyClass
,它将包含一些新方法和实例变量

如上代码所示,创建
Selenium::WebDriver::Driver
实例的方法是使用
Selenium::WebDriver.for


如果不大规模复制代码,我如何创建一个版本的
Selenium::WebDriver.for
,它与
Selenium::WebDriver.for
的功能相同,但创建
Selenium::WebDriver::Driver::MyClass

为什么不直接覆盖
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类并将您的行为添加到其中。

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

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

如果您坚持重写
for
方法,下面是一些代码片段,可能会有所帮助

模块硒
模块WebDriver
类驱动程序

类如果只想在驱动程序上定义一些额外的方法,则不需要重写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
问候,

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