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. ページ オブジェクトからメソッドを呼び出します。

あなたの例では、datepicker コントロールを定義する Datefunctions モジュールを作成します。

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 に答える