Richtige Methode, um auf eine zweite Seite zu warten, die mit Capybara geladen wird, wenn der erste das gleiche Feld wie der zweite hat

8

Ich habe ein Problem mit einer Spezifikation, die zwei Formulare mit demselben Feld ("E-Mail") auf beiden Formularen besucht. Wenn ich nicht manuell schlafe, scheint Capybara das "Email" Feld vom ersten Besuch im zweiten Teil des Tests zu finden.

%Vor%

Mit dem Schlaf drinnen geht die Spec mit Bravour. Ohne den Schlaf erhält die zweite Formularübermittlung einen Validierungsfehler - die Beschuldigung eines leeren "Email" -Wertes.

Gibt es einen richtigen Weg, damit umzugehen? Ich hasse es, manuelle Schläfer in unsere Spezifikationen einzuführen. Ich würde lieber Capybara sagen, dass sie das Konzept von dem, was sich bereits auf der Seite befindet, ignorieren sollte, oder etwas in dieser Richtung.

Danke.

    
Alex 23.01.2014, 16:27
quelle

4 Antworten

5

Hier sind ein paar Möglichkeiten, mit denen Sie es lösen können:

  1. Verwenden Sie einen anderen Locator, der nur auf der zweiten Seite vorhanden ist, um das Feld "Email" auszuwählen:

    %Vor%
  2. Schreiben Sie eine Anweisung, die darauf wartet, dass eine zweite Seite statt des Ruhezustands geladen wird:

    %Vor%
Andrei Botalov 24.01.2014, 21:20
quelle
3

Die obigen Antworten sind korrekt, aber schwierig zu implementieren, wenn Sie eine große Testsuite haben, weil Sie auf jeder Seite ein eindeutiges Element finden müssen. Wenn Sie ein Absolvent der Michael Hartl Rail School sind, gibt es einen einfachen Weg, dies zu lösen. Hartl lehrt, für jede Controller-Aktion eine andere @title -Instanzvariable einzustellen. Dies wird dann in application.html.erb verwendet, um ein HTML-Titelelement für jede Seite festzulegen.

Das tue ich ganz sicher, und es ermöglichte mir eine sehr einfache Möglichkeit, alle meine flockigen Tests zu reparieren, die fehlschlugen, weil die Seite nicht richtig geladen war. Sie können das Title-Tag nicht finden, da es nicht sichtbar ist. Also, was ich getan habe, wurde am Ende der application.html.erb, der folgende Code;

%Vor%

Dies fügt, wenn Sie sich im Testmodus befinden, ein div mit Titeltext ein, umgeben von eckigen Klammern. Dann schrieb ich einen Helfer, der in rails_helper.rb geht

%Vor%

Ich habe bereits einen anderen Helfer, der nach dem richtigen Titel sucht, also habe ich ihn so modifiziert, dass er in wait_for_page_load if;

hinzugefügt wurde %Vor%

Diese einfachen Änderungen haben fast alle meine flockigen Tests geklärt.

    
Obromios 07.01.2017 07:07
quelle
1

Wenn Sie auf Andreys 2) oben zurückgegriffen haben, sollten Sie sich das holdon-Juwel ansehen, das Ihnen das Schreiben ermöglicht ein Block, der darauf wartet, dass ein Element geladen wird, und dann zur Methode fill_in übergeht, sobald das Element geladen wird.

    
aceofbassgreg 27.01.2014 21:59
quelle
0

Im Allgemeinen kann es so gemacht werden. Um beispielsweise auf Schaltflächen zu klicken, die nach dem Laden eines modalen Popups (oder einer anderen Seite) gefunden werden, fügen Sie den folgenden Block zu Ihrer Makrodatei hinzu.

%Vor%

Hier finden Sie die Klasse .modal auf der Popup-Seite.

    
bir_ham 10.05.2016 20:34
quelle

Tags und Links