0

我正在尝试访问中定义的类方法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,一旦解决了我就会起飞。

4

2 回答 2

1

问题是它label_year是一个实例方法,而get_calender_year它是一个类方法。您不能调用实例方法,因为您尚未创建该类的实例。

正如 Billy Chan 所指出的,要使您的代码正常工作,您需要在模块中创建 Datefunctions 类的实例。这似乎有点尴尬,因为您需要将浏览器实例传递给 CalenderUtil 中调用的每个方法。对我来说 CalenderUtil 是一个抽象层,没有增加任何价值。

我认为你应该:

  1. 使用模块来封装跨多个页面使用的控件。
  2. 将这些模块包含在具有控件的页面对象类中。
  3. 从页面对象调用方法。

对于您的示例,我将创建一个 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'
于 2013-09-11T16:17:39.317 回答
1

原因是PageObject自动生成的方法都是实例方法。您不能在类方法中使用它,因为没有实例。

看文档的例子:

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
于 2013-09-11T14:25:59.087 回答