Nach dem Laden einer Seite habe ich Code, der verschiedene Elemente basierend auf den von einem xhr zurückgegebenen Daten ausführt und ausblendet und anzeigt.
Mein Integrationstest sieht ungefähr so aus:
it "should not show the blah" do
page.find('#blah').visible?.should be_true
end
Wenn ich in dem Kontext, in dem dieser Test ausgeführt wird, manuell zur Seite gehe, ist #blah nicht wie erwartet sichtbar. Ich vermute, dass Capybara den Anfangszustand der Seite (in diesem Fall unsichtbar) betrachtet, den Zustand des DOM bewertet und den Test nicht besteht, bevor der JS ausgeführt wird.
Ja, ich habe den :js => true
auf dem enthaltenden Beschreibungsblock gesetzt :)
Irgendwelche Ideen wären sehr dankbar! Ich hoffe, dass ich hier keine absichtliche Verzögerung einlegen muss, die sich schuppig anfühlt und die Dinge verlangsamt.
quelle
Antworten:
Ich denke, dass die
find
Anweisung hier die mit dem impliziten Warten ist, also wird Capybara warten, bis sich das Element auf der Seite befindet, aber nicht warten, bis es sichtbar wird.Hier möchten Sie, dass Capybara auf das Erscheinen des sichtbaren Elements wartet. Dies sollte durch Angabe der folgenden
visible
Option erreichbar sein:Ich habe es nicht ausprobiert, aber die
ignore_hidden_elements
Konfigurationsoption könnte auch hier nützlich sein, wenn Siefind
immer auf sichtbare Elemente warten möchten.quelle
js:true
auf dem enthaltenen Block haben, damit dies funktioniert.expect(page).to have_selector('#flash-message', visible: false, text: "Signed in Successfully")
- Danke, dass Sie diese Antwort gepostet habenDies ist eine andere Möglichkeit, die für mich vollkommen funktioniert:
Besonders für komplexere Funde wie
was behaupten würde, dass ein Element versteckt wurde.
quelle
should_not be_visible
sieht für mich nicht gut aus, wenn Capybara läuft,wait_until { base.visible? }
wenn Element # sichtbar ist? aufgerufen werden..should_not be_visible
Coverdisplay: none
von jQuery festgelegt wurden? Es scheint bei mir nicht zu funktionieren.Wenn Sie überprüfen möchten, ob sich ein Element auf der Seite befindet, aber nicht sichtbar ist,
visible: false
funktioniert es nicht wie erwartet. Hatte mich ein bisschen verblüfft.So geht's:
quelle
should_not
mit Capybara verwenden, wegen Ajaxhave_css
wird auf Ihre gesamte Timeout-Dauer gewartet, bevor Sie aufgeben, da erwartet wird, dass das Element gefunden wird. ZB muss manshould have_no_content
statt verwendenshould_not have_content
.expect(page).not_to have_selector("#some_element", visible: true)
funktionierte gut für mich mitjavascript_driver
, ohne die gesamte Timeout-Dauer zu warten.should_not
jetzt verwenden, sorry!Verwenden von:
Ich habe eine Rails-Anwendung, in der es einen Link gibt, der beim Klicken eine AJAX-Post-Anfrage senden und eine JS-Antwort zurückgeben soll.
Linkcode:
Die JS-Antwort (.js.haml-Datei) sollte das folgende versteckte Div auf der Seite, auf der der Link vorhanden ist, umschalten:
Inhalt der js.haml-Datei:
Ich habe mein Szenario getestet, in dem eine Benachrichtigung gesendet und dem Benutzer die Benachrichtigungsstatusmeldung mithilfe von Cucumber angezeigt wurde ( Gurkenschienen-Juwel mit integrierter Capybara-Unterstützung ) angezeigt wurde.
Ich habe versucht zu testen, ob das Element mit der ID: notification_status bei erfolgreicher Antwort in meiner Schrittdefinition sichtbar war. Dazu habe ich folgende Anweisungen versucht:
Keiner der oben genannten Punkte hat bei mir funktioniert und meinen Schritt nicht bestanden. Von den oben aufgeführten 5 Snippets sind die letzten 4 mit folgendem Fehler fehlgeschlagen:
Das war seltsam, weil die folgende Aussage richtig war:
Und tatsächlich habe ich die Seitenquelle mit überprüft
was sich zeigte
was erwartet wurde.
Schließlich fand ich diesen Link Capybara assert Attribute eines Elements , das zeigte sich , wie ein Element des Attributs in roher Weise zu untersuchen.
Auch habe ich in Capybara Dokumentation für sichtbar gefunden? Methode ( http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Element#visible%3F-instance_method ) folgende Informationen:
So kam ich zu dem Schluss, dass man beim Testen der Sichtbarkeit eines Elements nicht auf Ergebnisse von Capybaras Sichtbarkeit angewiesen ist? Methode bei Verwendung eines CSS-Selektors und Verwendung der im Link vorgeschlagenen Lösung capybara Assert-Attribute eines Elements
Ich habe mir Folgendes ausgedacht:
Verwendung:
quelle
Was sichtbar bedeutet, ist nicht offensichtlich
Der Fehler kann auf ein Missverständnis dessen zurückzuführen sein, was als sichtbar oder nicht sichtbar angesehen wird, da es nicht offensichtlich, nicht tragbar und unterdokumentiert ist. Einige Tests:
HTML:
Das einzige, was der Rack-Test als unsichtbar betrachtet, ist Inline
display: none
(kein internes CSS, da es keine Selektoren ausführt):Poltergeist hat ein ähnliches Verhalten, kann jedoch mit internen CSS- und Js-
style.display
Manipulationen umgehen :Selen verhält sich ganz anders: wenn ein leeres Element unsichtbar ist und
visibility-hidden
sowiedisplay: none
:Ein weiterer häufiger Haken ist der Standardwert von
visible
:false
(sieht beides sichtbare als auch unsichtbare Elemente),true
Capybara.ignore_hidden_elements
Option gesteuert .Referenz .
Vollständiger ausführbarer Test auf meinem GitHub .
quelle
Vielleicht möchten Sie sich diesen Beitrag ansehen , der eine Beispielmethode zum Warten auf den Abschluss aller Ajax-Anforderungen enthält:
quelle
wait_until
wurde aus Capybara 2 entfernt .Timeout.timeout
Selenium::WebDriver::Wait
Die akzeptierte Antwort ist jetzt etwas veraltet, da 'sollte' eine veraltete Syntax ist. Heutzutage ist es besser, wenn Sie etwas in der Art von tun
expect(page).not_to have_css('#blah', visible: :hidden)
quelle
Die anderen Antworten hier sind der beste Weg, um auf das Element zu "warten". Ich habe jedoch festgestellt, dass dies für die Site, an der ich arbeite, nicht funktioniert hat. Grundsätzlich war das Element, auf das geklickt werden musste, sichtbar, bevor die dahinter stehende Funktion vollständig geladen wurde. Dies ist in Bruchteilen von Sekunden, aber ich fand, dass mein Test gelegentlich so schnell lief, dass er auf die Schaltfläche klickte und nichts passierte. Ich habe es geschafft, das zu umgehen, indem ich diesen booleschen Make-Shift-Ausdruck gemacht habe:
Grundsätzlich wird die Standardwartezeit von Capybara verwendet, um nach etwas zu suchen, das angezeigt werden soll. Wenn es nicht vorhanden ist, wird Ihr Klick erneut versucht.
Wieder werde ich sagen, dass die
should have_selector
Methode zuerst versucht werden sollte, aber wenn es einfach nicht funktioniert, versuchen Sie diesquelle