2015-12-04 11 views
9

ich meine Tests mit RSpec und capybara-webkit zu verbessern, versuchen, die alle wie css und xpath Selektoren löschenElemente Finden von Datenattributen

find('#edit_user > div:nth-child(7) > div > div > button').click 

und ich bin für die beste Option suchen, um sie zu ersetzen.

Ich würde die css class der Elemente verwenden, aber einige "Pro" Capybara Tester sagte, das ist nicht die beste Option.

Also meine Frage ist: kann ich die data Attribute in meinen Tests verwenden?
Wenn ich ein Element haben

<button name="button" type="submit" class="button last" data-test="edit.update">Update/button> 

ich in der Lage sein

find('edit.update').click 

zu tun?

Und denken Sie, dass es eine gute Idee ist? Wenn Sie weitere Ideen/Infos zu diesem Thema haben, können Sie gerne einen Kommentar abgeben!

Antwort

8

Um Elemente mit ihrem Attribut data- * zu suchen, müssen Sie einen CSS-Selektor oder XPath verwenden.

Für den CSS-Selektor:

find('button[data-test="edit.update"]').click 

Für XPath:

find('//button[@data-test="edit.update"]').click 

Unabhängig davon, ob es eine gute Idee, hängt von der Anwendung wirklich ist. Sie möchten etwas auswählen, das das Element eindeutig identifiziert. Wenn "edit.update" nicht eindeutig ist, wäre es keine gute Wahl. Das Attribut class wäre in Ordnung, wenn die Schaltfläche eine eindeutige Klasse hätte, die "Schaltfläche" und "zuletzt" wahrscheinlich nicht sind.

Die beste Methode besteht darin, statische id Attribute zu verwenden, da diese innerhalb der Seite eindeutig sein sollten und sich weniger wahrscheinlich ändern. Die Methode find unterstützt auch das Auffinden von Elementen nach ID, was bedeutet, dass Sie keine CSS-Selektoren oder XPath schreiben müssen.

12

Die Antwort von Justin Ko ist korrekt, ich wollte nur etwas etwas Fortgeschritteneres hinzufügen, was in einigen Situationen zur Lesbarkeit des Tests beitragen kann. Sie können Ihre eigenen "Selektoren" zu Capybara hinzufügen, also wenn Sie wirklich Dinge durch ein Datentestattribut auswählen wollten (keine großartige Idee, da Sie nicht wirklich Attribute nur zum Testen hinzufügen möchten), könnten Sie viel tun

Capybara.add_selector(:dt) do 
    css { |v| "*[data-test=#{v}]" } 
end 

die Tests machen lassen würde dies

find(:dt, 'edit.update') 

verständlich, während auch komplizierte CSS oder Pfad Abfragen an einem einzigen Ort in Ihrem Testcode zu begrenzen. Anschließend können Sie eine Methode wie

def find_by_dt(value) 
find(:dt, value) 
end 

definieren, wenn Sie das Aussehen find_by_dt bevorzugen ...) zu finden (: dt, ...)

Sie auch Filter und Beschreibungen zu Ihrer eigenen Auswahl für mehr Flexibilität, bessere Fehlerbeschreibungen hinzufügen, usw. - siehe https://github.com/jnicklas/capybara/blob/master/lib/capybara/selector.rb für den von Capybara

+3

Warum denken vorgesehen Selektoren-in gebaut Sie, dass es nicht eine gute Idee, Attribute nur zum Testen hinzufügen? –

Verwandte Themen