So laden Sie eine csv-Datei nach der Anmeldung mit Casperjs herunter

8

Ich möchte eine CSV-Datei mit Hilfe von Caperjs herunterladen. Das habe ich geschrieben:

%Vor%

Und ich habe nyse.csv , aber die Datei war eine HTML-Datei für die Registrierung der Website.

Der Anmeldevorgang schlägt fehl. Wie kann ich mich korrekt anmelden und die CSV-Datei speichern?

2015/05/13

Nach Darrens Hilfe schrieb ich so:

%Vor%

Und dieser Code endet mit Fehler Wait timeout of 5000ms expired, exiting. . Soweit ich verstehe, bedeutet der Fehler, dass der CSS-Selektor das Element nicht finden konnte. Wie kann ich einen Weg finden, um dieses Problem zu beheben?

Aktualisierung am 18.05.2015

Ich schrieb so:

%Vor%

Ich habe timeout.html von Chrome-Entwicklertools und Firebugs überprüft und mehrfach bestätigt, dass das Element input vorhanden ist.

%Vor%

Wie kann ich dieses Problem beheben? Ich habe bereits mehrere Stunden für dieses Thema verbracht.

Update 2015/05/19

Danke für Darren, Urarist und Artjom Ich könnte den Timeout Fehler entfernen, aber es gibt noch einen weiteren Fehler.

Heruntergeladene CSV-Datei war noch Registrierungs-HTML-Datei, also schrieb ich den Code so um, um die Fehlerursache herauszufinden:

%Vor%

In der logined.html Benutzer E-Mail wurde korrekt ausgefüllt, aber das Passwort ist nicht ausgefüllt. Gibt es jemanden, der die Ursache dafür vermutet hat?

    
ironsand 11.05.2015, 06:34
quelle

2 Antworten

1

Der Trick besteht darin, sich erfolgreich anzumelden. Es gibt mehrere Möglichkeiten, sich anzumelden. Ich habe einige versucht und die einzige, die auf dieser Seite funktioniert, ist durch Auslösen der Formularübertragung mit der Enter-Taste. Dies geschieht mithilfe der Funktion PhantomJS page.sendEvent() . Die Felder können mit casper.sendKeys() gefüllt werden.

%Vor%

Es scheint, dass es notwendig ist, auf diese bestimmte Seite zu warten. CasperJS bemerkt nicht, dass eine neue Seite angefordert wurde und die then() function wird aus irgendeinem Grund nicht verwendet.

Andere Möglichkeiten, die ich ausprobiert habe, waren:

  • Füllen und Absenden des Formulars mit casper.fillSelectors()
  • Füllen Sie das DOM mit casper.evaluate() aus und senden Sie es, indem Sie mit casper.click() auf den Login-Button klicken
  • Mischen Sie alle oben genannten.
Artjom B. 23.05.2015, 11:57
quelle
1

Auf den ersten Blick sieht Ihr Skript vernünftig aus. Aber es gibt ein paar Möglichkeiten, es einfacher zu machen, die es auch robuster machen sollten.

Erstens, anstelle Ihrer evaluate() -Zeile,

%Vor%

Der Parameter true bedeutet, dass er übergeben wird. (Ich habe die Formularnamen erraten, aber ich bin ziemlich sicher, dass Sie weiterhin CSS-IDs verwenden können, wenn Sie bevorzugen.)

Aber noch besser ist es, das Formular nicht zu füllen, bis Sie sicher sind, dass es da ist:

%Vor%

Dies wäre wichtig, wenn das Login-Formular dort dynamisch von JavaScript platziert wird (möglicherweise sogar von einem Ajax-Aufruf) und daher nicht auf der Seite vorhanden ist, sobald die Seite geladen ist.

Die andere Änderung ist, anstatt casper.wait() zu verwenden, um eines der casper.waitForXXX() zu verwenden, um sicherzustellen, dass die csv-Dateiverknüpfung vorhanden ist, bevor Sie versuchen, sie herunterzuladen. Warten auf 3 Sekunden wird schiefgehen, wenn der Remote-Server mehr als 3,1 Sekunden benötigt, um zu antworten, und Zeit verschwendet, wenn der Remote-Server nur 1 Sekunde braucht, um zu antworten.

UPDATE: Wenn Sie eine Zeitüberschreitung in den waitFor -Zeilen erhalten, wird Ihnen mitgeteilt, dass der Grund für Ihr Problem darin liegt, dass Sie einen Selektor verwenden, der nicht vorhanden ist. Dies ist der größte Zeitverbraucher beim Schreiben von Casper-Skripten. (Ich stellte mir vor kurzem ein Tool vor, mit dem man versuchen konnte, ein Beinahe-Bein zu finden, aber niemanden mehr interessieren konnte, und es ist ein etwas zu großes Projekt für eine Person.) p>

  • Fügen Sie dem Befehl timeout waitFor() einen Fehlerhandler hinzu und erstellen Sie einen Screenshot ( casper.capture() ).
  • Dump den HTML . Wenn Sie die ID eines Eltern-Divs kennen, können Sie dies angeben, um einzuschränken, wie viel Sie suchen müssen.
  • Öffnen Sie die Seite mit FireBug (oder einem Tool Ihrer Wahl) und stöbern Sie herum, um herauszufinden, was da ist. (Denken Sie daran, dass Sie in der Konsole einen jQuery-Befehl oder den Befehl document.querySelector() eingeben können. Dies ist eine gute Möglichkeit, den richtigen Selektor interaktiv zu finden.)
  • Versuchen Sie es mit SlimerJS anstelle von PhantomJS (besonders wenn Sie PhantomJS 1.x verwenden). Es kann sein, dass die Site eine Funktion verwendet, die nur in neueren Browsern unterstützt wird.
Darren Cook 11.05.2015 11:26
quelle

Tags und Links