页面对象gem - 何时生成所需的方法?

时间:2013-11-11 13:53:54

标签: ruby page-object-gem

我相信在使用page-object gem时,有一个像

这样的方法调用
link(:sym, text: "example.com")

生成三种方法 - symsym_elementsym? 任何人都能明白以下疑惑吗?

  1. 何时创建这些方法,即页面对象类何时使用define_method来实现这些方法?
  2. 这些方法调用(link(:sym, text: "example.com")直接存在于类中,而不包含在另一个方法中!是否允许直接在类中包含语句而不包含在方法中?如果是这样,那些陈述的用途是什么?

    class Test
      include PageObject
    
      def example_method        
        puts "example method"    
      end
    
      link(:sym, text: "example.com")        
    end
    
  3. 我可以在班级中的方法中调用(link(:sym, text: "example.com")吗?这样做会引发NoMethodError !!这是不允许的?

1 个答案:

答案 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