1

私はスーパークラスDemoPageといくつかのサブクラスSDemoPageEDemoPageなどを持っています。これらのページはすべて同じ要素を持ち、SDemoPage見た目s-demo-test1の id とそれに対応する id がEDemoPage似ていますe-demo-test1。私のDemoPageクラスでは、すべての要素を宣言しました。サブクラス (呼び出し元のクラス) に基づいて ID を追加する方法が必要です。これは私が現在持っているものです。

class DemoPage
  include PageObject

  @@subclass_ids = {"SDemoPage" => "s-demo-",
   "EDemoPage" => "e-demo-"}

  # class << self; attr_accessor :current_class_id; end

  def initialize(browser, something)
    initialize_elements
    super(browser, something)
  end

  .........

  def initialize_elements
    self.instance_eval do
      select_list(:facility, id: "#{@current_class_id}facility")
      text_field(:account, id: "#{@current_class_id}account")
      text_field(:service, id: "#{@current_class_id}service")
   end
  end
end

class SDemoPage < DemoPage
  include PageObject

  @current_class_id = "s-demo-"
end

しかし、これは機能しません。エラーが発生します。undefined method 'select_list' for #<SDemoPage>...

これは私の最初の試みではありませんでした。最初に attr_accessor :current_page_id を設定してから初期化しようとしましたが、それもうまくいきませんでした。次に、メタクラスを開いてそこにIDを設定しようとしました。最後に、クラス インスタンス変数をオンに設定して、SDemoPage最終的にこのコードで動作させることができました。

class DemoPage
  include PageObject

  def initialize(browser, something)
    super(browser, something)
  end

  .........

  SDemoPage.instance_eval do
    select_list(:facility, id: "#{@current_class_id}facility")
    text_field(:account, id: "#{@current_class_id}account")
    text_field(:service, id: "#{@current_class_id}service")
  end
end

しかし、これでは、他の呼び出しクラスに基づいて ID を設定することはできません。

ハッシュルックアップの使用など、他の試みのいくつかのコードも残しましたが、ページオブジェクトメソッドが変数/メソッド @current_class_id が存在しないことをすでに認識した後、これらはまだ初期化メソッドでインスタンス変数を設定しています

ここからどこへ行けばいいのかわからない。


編集:

だから私は最終的にそれを理解しましたが、これがこの問題を解決するための最良の方法であるかどうかはわかりません:

class DemoPage
  include PageObject
  include DataMagic

  def initialize(browser, visit)
    super(browser, visit)
    instantiate_elements self.class
  end

  def instantiate_elements klass
    klass.class_eval do
      select_list(:facility, id: "#{@class_id}facility")
      text_field(:account, id: "#{@class_id}account")
      text_field(:service, id: "#{@class_id}service")
    end
  end
end

class SDemoPage < DemoPage
  include PageObject
  @class_id = "s-demo-"
end

このようにすると何か問題がありますか?ここに示していない他のものが含まれているため、initialize メソッドにモンキー パッチを適用する必要があります。SDemoPageそれで、私はすでにそれを行う必要があるので、実際のではなくのコンテキストで要素を本質的に「作成」しない理由はありますDemoPageか? それとも、ジャス​​ティンの答えは完全かつ完全に物事を行うためのより良い方法ですか?

編集 2: 私はジャスティンの答えを受け入れました.

4

1 に答える 1

2

最も簡単な解決策は次のとおりだと思います。

  1. アクセサー メソッドを呼び出す DemoPage のクラス メソッドを定義します。
  2. 子ページでこのメソッドを呼び出し、id 部分をパラメーターとして渡します。

DemoPage は次のようになります。

class DemoPage
    include PageObject

    def self.common_demo_elements(class_id)
        select_list(:facility, id: "#{class_id}facility")
        text_field(:account, id: "#{class_id}account")
        text_field(:service, id: "#{class_id}service")      
    end
end

子ページは次のようになります。

class SDemoPage < DemoPage    
    common_demo_elements("s-demo-")
end
于 2014-01-22T21:15:45.810 に答える