2016-03-24 3 views
1

Ich benutze das page-object-gem und versuche den besten Weg zu finden, meine Seitenelemente zu definieren, wenn eine Reihe von text_field eine unendliche Anzahl von Vorkommen hat.Seitenelementdefinition für geklonte Zeilen

Die HTML-Seite Last ähnlich der folgenden:

<div><input id="dx_1_code" value=""/> <input id="dx_1_dos" onblur="clone($(this),false)" value=""/></div>

Wenn der Benutzer die Laschen dann der letzte Eingang aus eine neue Zeile mit der ID-Werte geklont wird, der mit HTML inkrementieren gefällt folgt :

<div><input id="dx_2_code" value=""/> <input id="dx_2_dos" onblur="clone($(this),false)" value=""/></div> 
<div><input id="dx_3_code" value=""/> <input id="dx_3_dos" onblur="clone($(this),false)" value=""/></div> 

Mein erster Versuch war meine Klasse zu definieren, wie folgt:

class SamplePage 
    include PageObject 
    include DataMagic 

    text_field(:dx_1, :id => "dx_1_code") 
    text_field(:dx_2, :id => "dx_2_code") 
    text_field(:dos_1, :id => "dx_1_dos") 
    text_field(:dos_2, :id => "dx_2_dos") 

end 

Allerdings endete ich schnell mit einer Menge redundanter Einträge.

Gibt es eine bessere Möglichkeit, eine unbekannte Zahl oder solche Einträge in Bezug auf Element-Setups und die Verwendung der populate_page_with-Methode zu behandeln?

Antwort

1

Die Elemente sind indiziert, was sie zu einem guten Kandidaten für das Merkmal der indizierten Eigenschaften macht. Mit der indexed_property können Sie Locators definieren, bei denen beim Zugriff auf das Element eine Zahl ersetzt wird. Die Seite Objekt würde wie folgt aussehen:

class MyPage 
    include PageObject 

    indexed_property(:dx, [ 
    [:text_field, :code, {id: 'dx_%s_code'}], 
    [:text_field, :dos, {id: 'dx_%s_dos'}], 
    ]) 
end 

Die ersten beiden Zeilen würden dann mit eingegeben werden:

page = MyPage.new(browser) 
page.dx[1].code = 'a' 
page.dx[1].dos = 'b' 
page.dx[2].code = 'c' 
page.dx[2].dos = 'd' 

Leider gibt es keine integrierte Möglichkeit für die populate_page_with Methode mit indexierten Eigenschaften zu arbeiten. Wie bei allem, könnten Sie etwas hacken. Die Methode populate_page_with sucht nach einer "Element" -Methode sowie nach einer Setter-Methode. Wenn Sie dem Seitenobjekt Ihr eigenes hinzufügen, könnte die Methode verwendet werden.

class MyPage 
    include PageObject 

    indexed_property(:dx, [ 
    [:text_field, :code, {id: 'dx_%s_code'}], 
    [:text_field, :dos, {id: 'dx_%s_dos'}], 
    ]) 

    # Method for inputting the various dx code/dos values based on a Hash 
    def dx=(values) 
    values.each_pair do |index, fields| 
     fields.each_pair do |field, value| 
     dx[index].send("#{field}=", value) 
     end 
    end 
    end 

    # This is so that populate_page_with can check that the element is enabled/visible 
    def dx_element 
    dx[1].code_element 
    end 
end 

Dies würde Ihnen die Möglichkeit geben populate_page_with zu verwenden, indem eine Hash schicken, wo die Schlüssel der Index und die Werte sind die Felder/Werte für diesen Index sind. Die gleiche Eingabe der Seite, die wir vorher gemacht haben, kann jetzt wie folgt geschrieben werden:

page = MyPage.new(browser) 
page.populate_page_with(dx: { 
    1 => {code: 'a', dos: 'b'}, 
    2 => {code: 'c', dos: 'd'} 
}) 
Verwandte Themen