1

我在 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被调用的子类Selenium::WebDriver::Driver::MyClass,它将包含一些新方法和实例变量。

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

如果不批量复制代码,我如何创建一个Selenium::WebDriver.for与?Selenium::WebDriver.forSelenium::WebDriver::Driver::MyClass

4

3 回答 3

0

检查源代码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
于 2013-03-29T05:50:10.440 回答
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 类并将您的行为添加到其中。

于 2013-03-29T02:59:24.537 回答
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")

问候,

于 2015-12-05T18:00:49.310 回答