1

クラスの初期化で 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

これは正常に機能していますが、モジュールにリンク名をハードコーディングしたくありません。

また、最初のケースで初期化の時点でメソッドが利用できない理由を理解できません。

4

3 に答える 3

1

上記のコードには根本的な問題があります。まず第一に、page-object gem を使用すると、要素を高度に宣言でき、それらの宣言に基づいてメソッドが生成されます。page-object gem ができるもう 1 つのことは、実行時に要素を動的に見つけて、それらと対話できるようにすることです。2 つのアプローチを組み合わせようとしているようですが、うまくいきません。あなたの目標が生成されたメソッドアプローチを使用することである場合、上記のジャスティンの例は、あなたの状況を考えると最良のアプローチのようです.

要素を見つけて実行時にメソッドを呼び出す機能 (インスタンス レベルのメソッド) は、[name]_elementメソッドを呼び出すことによって実現されます。たとえば、link_elementすべてのインスタンス メソッド内で使用できるメソッドがありますが、PageObject::Elements::Link のインスタンスを返します。その戻りオブジェクトでメソッドを呼び出すことはできますが、その呼び出しはクラスレベルの への呼び出しのようなメソッドを生成しませんlink

あなたへの質問 - 事前にリンクを知っていますか? もしそうなら、宣言する方がはるかに簡単です

于 2013-04-13T13:56:02.743 に答える
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
于 2013-04-13T04:57:29.880 に答える