代码之家  ›  专栏  ›  技术社区  ›  barbasa

Cucumber Pageobject-未定义的方法链接

  •  1
  • barbasa  · 技术社区  · 12 年前

    我想使用PageObject 链接 方法初始化,但我无法做到:(

    以下是我要做的事情:

    class MyPage
      include PageObject
    
      def initialize
          link_names.each do |link_name|
               link link_name, :id => "id_#{link_name}"
          end
      end
    
      def link_names
        ...get link names from DB...
      end
    
    end
    

    当我在创建MyPage对象的实例时运行Cucumber时,我得到了以下错误:

    undefined method `link' for #<MyPage:0xa8dcf20> (NoMethodError)
    

    为了避免这个问题,我目前正在做的事情如下:

    class MyPage
      include PageObject
    
      link_names = ['link_a', 'link_b']
      link_names.each { |link_name|
         link link_name, :id => "id_#{link_name}"
       }
    end
    

    这很好,但我不想在我的模块中硬编码链接名称。

    此外,我无法理解为什么在第一种情况下初始化时该方法不可用。

    3 回复  |  直到 12 年前
        1
  •  1
  •   Justin Ko    12 年前

    链接(和其他访问器方法)是类级别的方法。这就是它在initialize方法中不可用的原因。

    你可以尝试定义 link_names 作为类级别的方法,然后做您现在正在做的事情。

    class MyPage
        include PageObject
    
        def self.link_names
            #Get the values from the database here
        end
        link_names.each do |link_name|
            link link_name, :id => "id_#{link_name}"
        end
    end
    
        2
  •  1
  •   Cheezy    12 年前

    上面的代码有一个基本问题。首先,页面对象gem允许您以高级方式声明元素,然后它将基于这些声明生成方法。页面对象gem可以做的另一件事是允许您在运行时动态查找元素,然后与它们交互。你似乎试图将这两种方法结合起来,但这是行不通的。如果你的目标是使用生成方法,那么考虑到你的情况,上面Justin的例子似乎是最好的方法。

    通过调用 [name]_element 方法例如,有一个 link_element 方法在所有实例方法中都可用,但它将返回PageObject::Elements::Link的实例。您可以调用该返回对象上的方法,但该调用不会生成类似于对的类级调用的方法 link .

    有一个问题要问你-你事先知道链接吗?如果是这样的话,那么仅仅声明就简单多了

        3
  •  0
  •   sheg    12 年前

    除了类级别的方法之外,页面对象gem还打算在不重写构造函数的情况下使用。看看这个, https://github.com/cheezy/page-object/wiki/Get-me-started-right-now !.

    如果您绝对需要对页面初始化进行某些操作,那么您可以定义initialize_page方法。您仍然无法调用initialize_page中的类级方法,但如果您想在初始化页面对象时加载数据库信息,可以使用它。根据页面对象模块源,initialize方法检查initialize_page方法,如下所示:

     def initialize(browser, visit=false)
        initialize_accessors if respond_to?(:initialize_accessors)
        initialize_browser(browser)
        goto if visit && respond_to?(:goto)
        initialize_page if respond_to?(:initialize_page)
      end