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?
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?
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.
Wie kann ich dieses Problem beheben? Ich habe bereits mehrere Stunden für dieses Thema verbracht.
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?
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.
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:
casper.fillSelectors()
casper.evaluate()
aus und senden Sie es, indem Sie mit casper.click()
auf den Login-Button klicken
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,
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>
waitFor()
einen Fehlerhandler hinzu und erstellen Sie einen Screenshot ( casper.capture()
). document.querySelector()
eingeben können. Dies ist eine gute Möglichkeit, den richtigen Selektor interaktiv zu finden.) Tags und Links javascript csv casperjs