我想在我的课程初始化中使用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
这很好用,但我不希望在我的模块中硬编码链接名称。
此外,我无法理解为什么在第一种情况下初始化时该方法不可用。
答案 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