0

我的代码有很多这样的:driver.blahblahblah. 考虑以下代码示例,取自http://www.browserstack.com/automate/ruby

require 'rubygems'
require 'selenium-webdriver'    
driver = Selenium::WebDriver.for(:remote,
  :url => "http://USERNAME:ACCESS_KEY@hub.browserstack.com/wd/hub")
driver.navigate.to "http://www.google.com/ncr"
element = driver.find_element(:name, 'q')
element.submit
puts driver.title
driver.quit

我怎样才能driver隐含?例如有一个方法叫做driver.save_screenshot(). 我想说save_screenshot("a.png")因为只有driver变量/对象有这个方法。

4

2 回答 2

2

您可以delegate从 ActiveSupport 使用,如下例所示:

require 'active_support/core_ext/module/delegation'

class MyClass
  delegate :find_element, :save_screenshot, to: :driver

  def foo
    find_element
    save_screenshot
  end

  def driver
    @driver ||= Driver.new
  end
end

class Driver
  def find_element
    puts "find_element"
  end

  def save_screenshot
    puts "save_screenshot"
  end
end

MyClass.new.foo

或者使用SimpleDelegator装饰驱动程序(但我不建议这样做)。

于 2014-08-24T09:34:11.347 回答
0

如果您有很多接收者为 的方法driver,那么使接收者隐式的方法是:

driver.instance_eval do
  method_1...
  method_2...
  ...
end

但请注意,这会减慢一点。如果你只是想找个偷懒的方法,那么最好的方法是让局部变量像单个字母一样短,不要费心让它隐含。

d = .... # instead of `drive`
d.method_1...
d.method_2...
...
于 2014-08-24T09:25:17.273 回答