我在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
的实例?
答案 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 code。 Selenium::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")
此致