问题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