1

我想在我的类初始化中使用 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

这工作正常,但我不想在我的模块中硬编码链接名称。

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

4

3 回答 3

1

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

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

给你一个问题——你提前知道链接吗?如果是这样,那么声明会简单得多

于 2013-04-13T13:56:02.743 回答
1

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

您可以尝试定义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
于 2013-04-12T14:12:04.113 回答
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
于 2013-04-13T04:57:29.880 回答