我正在尝试访问Module
中定义的类方法,我可以调用函数但函数有页面对象元素执行某些操作,如点击,我收到以下错误:
undefined method "label_year" for Datefunctions:Class (NoMethodError)
这是我的文件结构:
./lib/calender_util.rb
:
module CalenderUtil
def set_date
Datefunctions.get_calender_year
end
end
class Datefunctions
include PageObject
span(:label_year, :class=> 'ui-datepicker-year')
span(:label_month, :class=> 'ui-datepicker-month')
def self.get_calender_year
return label_year
end
end
./home_page.rb
:
require 'calender_helper.rb'
include CalenderUtil
def setTravelDate date
CalenderUtil.set_date
end
env.rb
的部分内容:
require 'page-object'
require 'page-object/page_factory'
$: << File.dirname(__FILE__)+'/../../lib'
require 'calender_helper.rb'
include CalenderHelper
World PageObject::PageFactory
World CalenderHelper
另外;我已经定义了include / require多次,一旦解决了我就会起飞。
答案 0 :(得分:1)
原因是,PageObject自动生成的方法都是实例方法。你不能在类方法中使用它,因为没有实例。
查看doc的示例:
class LoginPage
include PageObject
text_field(:username, :id => 'username')
text_field(:password, :id => 'password')
button(:login, :id => 'login')
end
login_page.username = 'cheezy'
login_page.password = 'secret'
login_page.login
这些方法适用于实例。
要修复,您需要创建一个实例。
module CalenderUtil
def set_date
page = Datefunctions.new(args_foo)
page.label_year
end
end
答案 1 :(得分:1)
问题是label_year
是实例方法,而get_calender_year
是类方法。由于尚未创建类的实例,因此无法调用实例方法。
正如Billy Chan指出的那样,为了使代码正常工作,您需要在模块中创建Datefunctions类的实例。这似乎有点尴尬,因为您需要将浏览器实例传递给CalenderUtil中调用的每个方法。对我来说,CalenderUtil是一个抽象层,没有添加任何值。
我认为你应该:
对于您的示例,我将创建一个Datefunctions模块,用于定义datepicker控件。
module DateFunctions
include PageObject
span(:label_year, :class=> 'ui-datepicker-year')
span(:label_month, :class=> 'ui-datepicker-month')
end
然后,对于使用datepicker控件的每个页面类,包括模块:
class MyPage
include PageObject
include DateFunctions
end
在你的测试中,我认为它是Cucumber,但对于任何框架都是如此,使用页面对象中的方法。
page = MyPage.new(browser)
page.label_year.should == '1/1/2013'