【问题标题】:page object gem - when are the required methods generated?页面对象 gem - 何时生成所需的方法?
【发布时间】:2013-11-11 23:13:12
【问题描述】:

我相信在使用 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!!这是不允许的吗?

【问题讨论】:

    标签: ruby page-object-gem


    【解决方案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
    

    【讨论】:

    • 很棒的解释!!感谢每个案例的示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 2022-08-18
    • 2012-07-02
    相关资源
    最近更新 更多