0

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

4

1 回答 1

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:是否允许直接在类中包含语句而不被包装在方法中

是的,方法调用可以直接在类体内完成。

这个另一个问题很好地解释了它:

类定义的主体是代码的执行上下文,就像其他任何代码一样。那里的代码在类的上下文中执行(意味着 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
于 2013-11-11T15:13:12.690 回答