从模块访问类页面对象时出现未定义的方法错误

时间:2013-09-11 14:02:45

标签: ruby page-object-gem

我正在尝试访问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多次,一旦解决了我就会起飞。

2 个答案:

答案 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是一个抽象层,没有添加任何值。

我认为你应该:

  1. 使用模块封装跨多个页面使用的控件。
  2. 将这些模块包含在具有控件的页面对象类中。
  3. 从页面对象中调用方法。
  4. 对于您的示例,我将创建一个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'