我正在制作一个页面对象。
require 'watir-webdriver'
class Page
attr_accessor :driver
def initialize
@driver = Watir::Browser.new :phantomjs
@driver.goto(some_arbitrary_url)
end
def element(**attrs)
@driver.element( id: attrs[:id], tag_name: attrs[:tag_name])
end
def elements(**attrs)
@driver.elements( class: attrs[:class], tag_name: attrs[:tag_name])
end
end
然而,当我将 Page
类子类化时,我不能在类主体中使用它的 element
方法,除非我将它们放在一个方法中,如下所示:
class Home < Page
#throws NoMethodError: undefined method 'element' for Home:Class
some_element = element(id: 'elements_id')
#works
def some_arbitrary_element
element(id: 'elements_id')
end
end
到目前为止,我只是在修补,我已经尝试过 protected: element, elements
以及 self.element(...)
都无济于事。发生什么了?我没有在 Matz 的 Ruby 书中阅读任何关于方法继承的启发性内容,而且通常 Ruby 是如此不足为奇,所以我很难确定问题到底出在哪里。
最佳答案
您正在调用元素,就好像它被定义为类方法一样。任何在类定义中但不在方法定义中的代码都只能调用类方法。使该方法从调用它的地方可见的一种方法是更改签名,使其成为类对象的方法。
class Page
def self.element
end
end
关于Ruby 子类不继承父方法或无法调用类主体中的父方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38166530/