私はスーパークラスDemoPage
といくつかのサブクラスSDemoPage
、EDemoPage
などを持っています。これらのページはすべて同じ要素を持ち、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: 私はジャスティンの答えを受け入れました.