我相信在使用page-object gem时,有一个像
这样的方法调用link(:sym, text: "example.com")
生成三种方法 - sym
,sym_element
和sym?
任何人都能明白以下疑惑吗?
define_method
来实现这些方法? 这些方法调用(link(:sym, text: "example.com"
)直接存在于类中,而不包含在另一个方法中!是否允许直接在类中包含语句而不包含在方法中?如果是这样,那些陈述的用途是什么?
class Test
include PageObject
def example_method
puts "example method"
end
link(:sym, text: "example.com")
end
我可以在班级中的方法中调用(link(:sym, text: "example.com"
)吗?这样做会引发NoMethodError
!!这是不允许的?
答案 0 :(得分:1)
问题1.何时创建这些方法
在评估类块时执行方法(例如link
)。
例如,您可以使用以下代码创建一个文件,这只是页面对象类的定义。如果执行它,您将看到sym
方法在调用link
方法后立即存在。
require 'page-object'
class Test
include PageObject
# The link method has not yet been called so sym will not exist yet
puts Test.method_defined?(:sym)
#=> false
link(:sym, text: "example.com")
# Since link has executed the define_methods, sym now exists
puts Test.method_defined?(:sym)
#=> true
end
问题2:是否允许直接在一个类中包含语句而不包含在方法中
是的,方法调用可以直接在类体内完成。
其他question很好地解释了这一点:
类定义的主体是代码的执行上下文 像其他任何一样。代码在类的上下文中执行 (意思是self是类对象,它是Class的一个实例)。您 可以有本地和实例变量(属于该类 对象本身而不是类的实例),你可以调用任何 类对象响应的方法。代码在类上运行一次 定义块已经完成。
不确定您对语句的用法是什么意思。但是,在这种情况下,使用link
等方法可以帮助创建页面对象的方法。它允许您指定参数,从而在每个页面对象中生成一致的方法。
问题3:我可以在课堂上的方法中调用链接
是的,您可以从其他方法调用link
方法。但是,链接方法是类方法。因此,您只能像调用其他类方法一样调用它。
以下显示使用类方法和实例方法调用链接方法。
require 'page-object'
require 'watir-webdriver'
class Test
include PageObject
def create_method_from_instance()
self.class.link(:sym_instance, text: "example.com")
end
def self.create_method_from_class()
link(:sym_class, text: "example.com")
end
end
# link can be called using class methods
puts Test.method_defined?(:sym_class) #=> false
Test.create_method_from_class
puts Test.method_defined?(:sym_class) #=> true
# link can be called using instance methods
b = Watir::Browser.new
page = Test.new(b)
puts page.methods.include?(:sym_instance) #=> false
page.create_method_from_instance
puts page.methods.include?(:sym_instance) #=> true