问题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:是否允许直接在类中包含语句而不被包装在方法中
是的,方法调用可以直接在类体内完成。
这个另一个问题很好地解释了它:
类定义的主体是代码的执行上下文,就像其他任何代码一样。那里的代码在类的上下文中执行(意味着 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