1

在 watir-classic gem 中,我们在 Element 类下有一个名为 generate_ruby_code() 的方法。我想修补它并修改一些东西。

我所做的是:

我的文件.rb


require 'watir-classic'
module Watir
    class Element
        def generate_ruby_code(element, method_name, *args)
            puts "Print this"
        end
    end
end

但是不是调用我的猴子修补方法,而是每次调用 Element 类中的原始 generate_ruby_code ,我不想发生这种情况。

请帮我解决这个问题。

4

2 回答 2

2

问题

我假设您使用的是 watir-classic v3.7.0 或更早版本。

在这些版本中,doingrequire 'watir-classic'不会立即加载所有类。一些类,包括 Watir::Element,在创建浏览器实例之前不会加载。

这意味着:

# Does not create Watir::Element#generate_ruby_code yet
require 'watir-classic'

# You create a Watir::Element#generate_ruby_code method
module Watir
    class Element
        def generate_ruby_code(element, method_name, *args)
            puts "Print this"
        end
    end
end

# Watir loads the Watir::Element#generate_ruby_code, which overrides yours
browser = Watir::Browser.new

我的理解是,这是由于 tp watir-classic 以前支持多种浏览器 - 即 FireWatir 和 SafariWatir。根据所使用的浏览器自动加载各种类。

解决方案 1 - 升级到 v4.0 或更高版本

最简单的解决方案是将您的 watir-classic 升级到 v4.0 或更高版本(当前最新版本为 4.0.1)。

此版本中删除了自动加载,这意味着您的代码现在可以按原样工作。

解决方案 2 - 首先初始化浏览器

如果升级不是一个选项,您需要在猴子修补之前手动强制自动加载。您可以通过简单地引用常量来做到这一点:

Watir::IE

只需在需要 watir-classic 之后和猴子修补之前的某个时间点包含此内容。

require 'watir-classic'
Watir::IE # this will load the code

module Watir
    class Element
        def generate_ruby_code(element, method_name, *args)
            puts "Print this"
        end
    end
end

browser = Watir::Browser.new
browser.goto 'www.google.ca'
browser.link.click_no_wait
#=> "Print this"
于 2013-10-30T11:18:46.017 回答
0

看,我不知道你的情况到底发生了什么,但你可以安全地排除 Ruby 故障。以下是您可以做的一些提示:

# Assuming that your element of class Watir::Element is stored in variable x:

x.method( :generate_ruby_code ).owner # will give you the owning module

x.method( :generate_ruby_code ).source_location # will give you the place where the method is,
# that is going to be used when you send x the message :generate_ruby_code

x.class # will confirm that your object indeed is what you think it is

x.singleton_class.ancestors # will give you the full method lookup chain for x

有了这个,你应该能够发现为什么你对 x 的行为的期望没有得到满足。

于 2013-10-30T07:07:17.747 回答