黄瓜Pageobject - 未定义的方法链接

时间:2013-04-12 12:50:19

标签: ruby cucumber bdd page-object-gem

我想在我的课程初始化中使用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 个答案:

答案 0 :(得分:1)

link(和其他访问器方法)是类级方法。这就是为什么它在初始化方法中不可用。

您可以尝试将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

答案 1 :(得分:1)

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

通过调用[name]_element方法,可以在运行时(实例级方法)查找元素并在其上调用方法。例如,在所有实例方法中都有一个link_element方法,但它将返回一个PageObject :: Elements :: Link实例。您可以在该返回对象上调用方法,但调用不会生成类似于link的类级别调用的方法。

给你一个问题 - 你提前知道这些链接吗?如果是这样,那么宣布

会简单得多

答案 2 :(得分:0)

除了类级别的方法之外,还要使用页面对象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