Ruby Monkey修补watir经典方法不起作用

Ruby Monkey修补watir经典方法不起作用,ruby,watir,monkeypatching,Ruby,Watir,Monkeypatching,在watir classic gem中,元素类下有一个名为generate_ruby_code()的方法。我想猴子补丁它和修改一些东西 我所做的是: MyFile.rb 需要“watir classic” 模块瓦特 类元素 def generate_ruby_代码(元素、方法名称、*args) 将“打印此” 结束 结束 结束 但不是调用我的monkey patched方法,而是每次调用元素类中最初的generate_ruby_代码,我不希望发生这种情况 请帮我解决这个问题。听着,我不知道你的

在watir classic gem中,元素类下有一个名为generate_ruby_code()的方法。我想猴子补丁它和修改一些东西

我所做的是:

MyFile.rb
需要“watir classic”
模块瓦特
类元素
def generate_ruby_代码(元素、方法名称、*args)
将“打印此”
结束
结束
结束
但不是调用我的monkey patched方法,而是每次调用元素类中最初的generate_ruby_代码,我不希望发生这种情况


请帮我解决这个问题。

听着,我不知道你的情况到底发生了什么,但你可以放心地排除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的行为预期没有达到。

问题

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

在这些版本中,执行
要求“watir classic”
不会立即加载所有类。一些类,包括Watir::元素,在创建浏览器实例之前不会加载

这意味着:

# 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-首先初始化浏览器

如果升级不是一个选项,您需要手动强制自动加载,然后再进行monkey修补。您可以通过以下方式简单地引用常量来完成此操作:

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"

您能显示从何处调用该方法的代码吗?最初,generate_ruby_code()方法是从同一类上的方法_missing()调用的。因此,当我调用click\u no\u wait()方法时,会调用方法\u missing(),然后依次调用generate\u ruby\u code()。但仍然会显示代码的一部分,从中调用方法。。。让我想想……考虑到我目前工作区域的环境,第一种解决方案可能不是最好的选择。但第二个解决方案很有魅力。谢谢Justin Ko。顺便说一下,你根本不需要打开新的IE窗口,只需要触发自动加载机制。您可以这样引用常量本身:
require“watir classic”;瓦蒂尔:这将加载代码
谢谢@JarmoPertman,我不知道。答案已经更新。那些将在你手下工作的人,他们将学到很多。。。我想念你工作的地方!