1

アドレス用の 3 つの div (メイン アドレス、セカンダリ アドレス、アドレスの追加) を含むフォームがあります。各 div には次の要素 (text_field) が含まれます: 名前、住所、電話。場合によっては、特定の div のテキスト フィールドを編集したいと考えています。

だから私はこのシナリオを持っています:

Given I am at the form for editing addresses
When the div "main address" is visible
Then fill the "name" element for the "main address" div
And erase the "address" for the "main address" div

そして、次のステップの定義:

Then(/^fill the "([^"]+)" element for the "([^"]+)" div$/) do |element, div|
   on_page(AddressPage).fill_element element div
end

そして今、私がよくわからない部分 - アドレスページ

class AddressPage
  include PageObject
  include DataMagic
  div(:main_address, :id => 'main_address')
  div(:secondary_address, :id => 'secondary_address')
  div(:add_address, :id => 'add_address')

  def fill_element(element, div)
    current_div = self.send("#{div}_element")
    # now the part I don't know how to do:
    current_element = div.search_within(current_div, element)
    fill_with_correct_data current_element
  end

  def search_within(div, element)
    # How to do this?
  end
end

すべての div のすべての要素を定義する必要がないようにするにはどうすればよいですか (div の数は動的です)。私が知る必要があるのは、要素を検索して別の要素の中に入れる方法があるかどうかです。

ありがとう :)


編集html は次のようになります。

<div id='main_address'>
    <input id='name'>
    </input>
    <input id='address'>
    </input>
    <input id='phone'>
    </input>
</div>
<div id='secondary_address'>
    <input id='name'>
    </input>
    <input id='address'>
    </input>
    <input id='phone'>
    </input>
</div>
<div id='add_address'>
    <input id='name'>
    </input>
    <input id='address'>
    </input>
    <input id='phone'>
    </input>
</div>

2番目の編集ポイントは、これも宣言することでした:

select_list(:name, :id => 'name')
select_list(:address, :id => 'address')
select_list(:phone, :id => 'phone')

#Is this possible?
current_name_element = main_address.name
#?
#Also, at the end the point is to call the Datamagic populate_page_with method
populate_page_with data_for 'new_user'

「default.yml」は次のようになります。

new_user:
  name: ~first_name
  address: ~address
  phone: ~phone

これが埋められるdivを選択できる場所。これは可能ですか?

4

1 に答える 1

1

要素ロケーターを使用して、要素内の要素を見つけることができます。これらのメソッドは、アクセサー メソッドで使用するのと同じタイプのロケーターを使用します。

たとえば、特定の に対して、current_div関連するテキスト フィールドを取得できます。

current_element = current_div.text_field_element(:id => 'name')
current_element = current_div.text_field_element(:id => 'address')
current_element = current_div.text_field_element(:id => 'phone')

注: これらのロケーターの変更が必要になる場合があります。ID はページ上で一意である必要があるため、おそらくこれらの ID は正確ではありません。

fill_element上記をページ オブジェクトに適用すると、メソッドを次のように定義できます。

def fill_element(element, div)
  current_div = self.send("#{div}_element")   
  current_element = current_div.text_field_element(:id => element)

  # I assume this is a method you have already
  fill_with_correct_data current_element
end

メソッドの呼び出しは次のようになります。

page.fill_element('name', 'main_address')
page.fill_element('address', 'secondary_address')
page.fill_element('phone', 'add_address')

更新 - Scoped Locator の作成:

これは少し面倒に思えますが、ページ オブジェクト gem の現在の実装を考えると、私が考えることができる最善の方法です。これをよりクリーンにするgemのバックログ機能リクエストがいくつかあると思います。

あなたができることは次のとおりです。

class AddressPage
    include PageObject

    class ScopedLocator
        def initialize(name, page_object)
            @name = name
            @page = page_object
        end

        def populate_with(data)
            scoped_data = Hash[data.map {|k, v| ["#{@name}_#{k}", v] }]
            @page.populate_page_with scoped_data
        end

        def method_missing(m, *args)  
            @page.send("#{@name}_#{m}", *args)
        end
    end

    ['main_address', 'secondary_address', 'add_address'].each do |name|
        define_method(name) { ScopedLocator.new(name, self) }
        text_field("#{name}_name"){ div_element(:id => name).text_field_element(:id => 'name') }
        text_field("#{name}_address"){ div_element(:id => name).text_field_element(:id => 'address') }
        text_field("#{name}_phone"){ div_element(:id => name).text_field_element(:id => 'phone') }
    end  
end

これは2つのことを行います:

  1. 各アドレスに対して通常のアクセサが作成されます。たとえば、:main_address_name、:main_address_address、および :main_address_phone を作成します (他のアドレス タイプについても同様です)。
  2. main_addressたとえば、アクションを通常のアクセサーに委譲するメソッドを作成します。これはmain_address.populate_with構文を与えることです。

このページ オブジェクトを使用すると、特定のアドレス セクションに対して populate_with を実行できます。

page.main_address.populate_with data_for 'new_user'
page.secondary_address.populate_with data_for 'new_user'
page.add_address.populate_with data_for 'new_user'

アドレスの個々のフィールドを更新することもできます。例えば:

page.main_address.name = 'user'
于 2014-03-12T15:01:10.243 に答える