Um das vorhandene Wissen hier zu erweitern:
Für JS-Tests muss Capybara zwei Threads (einen für RSpec, einen für Rails) und einen zweiten Prozess (den Browser) synchron halten. Dies geschieht durch Warten (bis zur konfigurierten maximalen Wartezeit) in den meisten Matchern und Knotenfindungsmethoden.
Capybara hat auch Methoden, die in erster Linie nicht warten Node#all
. Wenn Sie sie verwenden, teilen Sie Ihren Spezifikationen mit, dass sie zeitweise fehlschlagen sollen.
Die akzeptierte Antwort schlägt vor page.first('selector')
. Dies ist zumindest für JS-Spezifikationen wegen der Verwendung unerwünschtNode#first
Node#all
.
Das heißt, Node#first
ich werde warten, wenn Sie Capybara so konfigurieren:
# rails_helper.rb
Capybara.wait_on_first_by_default = true
Diese Option wurde in Capybara 2.5.0 hinzugefügt und ist standardmäßig falsch.
Wie Andrei erwähnt, sollten Sie stattdessen verwenden
find('selector', match: :first)
oder ändern Sie Ihren Selektor. Entweder funktioniert gut, unabhängig von Konfiguration oder Treiber.
Um die Sache noch weiter zu verkomplizieren, werden in alten Versionen von Capybara (oder mit aktivierter Konfigurationsoption) #find
Mehrdeutigkeiten gerne ignoriert und nur der erste passende Selektor zurückgegeben. Dies ist auch nicht besonders gut, da dadurch Ihre Spezifikationen weniger explizit werden. Ich kann mir vorstellen, dass dies nicht mehr das Standardverhalten ist. Ich werde die Einzelheiten weglassen, da sie oben bereits besprochen wurden.
Mehr Ressourcen: