2016-06-01 17 views
0

Wie finde ich ein Element, wenn es an mehreren Stellen auf einer Seite existiert, aber dieselbe ID unter derselben Klasse hat? Zum Beispiel: Es gibt zwei Textfelder mit der gleichen ID und ich möchte die zweite wählen. Es funktioniert, wenn ich schreibe nur die watir/Rubin (ohne Seitenobjekt zu verwenden) @ b.text_fields (: id => ‚Farbe‘). Last.set „red“Finden eines bestimmten Elements, das an mehreren Stellen existiert, aber dieselbe ID hat, Klasse

Aber ich bin bisher nicht erfolgreich zu machen Es funktioniert mit Seitenobjekt.

Vielen Dank im Voraus

+4

Sie sollten nie zwei HTML-Elemente mit der gleichen ID haben. – Abdo

+0

Irgendwie hat der Webentwickler dieselbe ID verwendet. Was ist, wenn eines der Elemente versteckt ist? – Rocker

+1

Wenn zwei Elemente auf derselben Seite mit derselben ID vorhanden sind, handelt es sich um einen beschädigten Code. Es spielt keine Rolle, welchen Typ die Elemente haben, ** irgendwelche ** zwei Elemente mit derselben ID auf derselben Seite sind falsch. Es ist ein Bug und muss wie jeder andere Bug behoben werden. –

Antwort

1

Wie in den Kommentaren erwähnt, ist die beste Lösung, um die Felder zu aktualisieren eindeutige IDs zu haben.

Wenn dies jedoch nicht möglich ist, können Sie das Problem mit einem :index Locator lösen. Das folgende Seite Objekt findet das zweite Farbfeld, das Watir äquivalent ist @b.text_field(:id => 'color', :index => 1).set:

class MyPage 
    include PageObject 

    text_field(:color_1, id: 'color', index: 0) 
    text_field(:color_2, id: 'color', index: 1) 
end 

, die wie genannt werden würden:

page = MyPage.new(browser) 
page.color_1 = 'red' 
page.color_2 = 'blue' 

Wenn Sie versuchen, tatsächlich auf das letzte Feld, das heißt replizieren @b.text_fields(:id => 'color').last.set , dann würde die :index „-1“ sein:

text_field(:color_2, id: 'color', index: -1) 

Beachten Sie, dass ähnliche getan werden kann, wenn die Felder Lokalisierung dynamischer ly in einem Verfahren (wie durch einen Accessor definiert Gegensatz zu):

class MyPage 
    include PageObject 

    def set_colors(color_1, color_2) 
    text_field_element(id: 'color', index: 0).value = color_1 
    text_field_element(id: 'color', index: 1).value = color_2 
    end 
end 
0
@b.text_fields(:id=>'color',:index=>1).set "red" 

dies Ihr Problem lösen kann.

+1

Ich glaube, die Frage sucht nach einer Lösung mit einer Seitenobjekt-Edelsteinlösung im Gegensatz zu einer reinen Watir-Lösung. –

+0

Justin Ko, Ja, du hast Recht. Mein Fehler – saruchi