2014-01-06 3 views
17

Ich habe ein interessantes Problem gefunden, als ich mich mit PhantomJS anmelden wollte. Ich weiß nicht, warum es tatsächlich passiert.phantomjs - Cookie wird für keine XHR/POST/GET gesendet. AJAX-Anfragen

Grundsätzlich starten Sie einen Remote-Debugger wie so hoch:

/usr/local/bin/phantomjs --web-security=no --remote-debugger-port=13379 --remote-debugger-autorun=yes /tmp/test.js 

Im Remote-Debugger:

> location.href = "https://www.mysite.com/login" 
> $('input[name="username_or_email"]').val('[email protected]') 
> $('input[name="password"]').val('wrongpassword') 

> $('button[type="submit"]').submit() 

dies in Chrome Dadurch wird mir die richtige "falsches Passwort" Nachricht nach dem XHR geben Anfrage, während phantomjs mir einen allgemeinen Fehler gibt, da kein Cookie mit phantomjs gesendet wird (ich überprüfte die Überschriften).

Ich bin ziemlich verwirrt darüber, warum phantomjs das Cookie mit der POST-Anfrage nicht sendet. Weiß jemand, wie wir phantomjs bekommen können, um den Cookie mit ALLEN Anfragen zu senden, wie es sollte? Das Setzen einer Cookie-Datei macht auch keinen Unterschied.

+0

10 Hey Geesu, hast du eine Lösung für dein Problem gefunden? Ich habe ein ähnliches Problem. http://stackoverflow.com/questions/23679287/why-is-the-cookie-header-not-set-on-my-same-domain-ajax-request-within-phantom – Senad

+0

Leider habe ich nie getan. Ich habe es einfach aufgegeben, Phantomjs zu verwenden und habe begonnen, das Mechanize-Juwel zu benutzen, um die Anfragen zu fälschen (genau wie Net :: HTTP). – Geesu

+1

Eine Bounty oben hinzugefügt - Ich habe zahlreiche Threads gefunden, die dieses Problem ansprechen, aber keine Antworten. Haltet! – starsinmypockets

Antwort

1

Ok, dies scheint etwas mit Session-Cookies und nicht regulären Cookies zu tun.

Hier ist ein großer Thread auf dem Entwickler verantwortlich für die Cookies-Funktion von Phantomjs und einige Jungs mit dem gleichen Problem wie Ihre.

https://groups.google.com/forum/#!msg/phantomjs/2UbPkIibnDg/JLV9jBKxhIQJ

Wenn Sie möchten nicht durch die gesamte Datei skirm, im Grunde: PhantomJS verhält sich wie ein normaler Browser, und es löscht alle Session-Cookies, wenn Browser, in Ihrem Fall schließt, wenn die Skriptausführung beendet.

Also, auch wenn Sie den --cookies-file =/Pfad gesetzt/to/cookies.txt Option werden Sie nur speichern reguläre Cookies auf sie, für subsecuent Hinrichtung.

Es gibt zwei mögliche Ansätze für Sie. Eine besteht darin, alle Anfragen innerhalb desselben Skripts zu stellen, oder die andere besteht darin, die Cookies manuell zu speichern und wiederherzustellen.

Auf dem Thread gibt es ein paar Funktionen, die Sie dazu verwenden können.

function saveCookies(sessionCookieFile, page) { 
    var fs = require("fs"); 
    fs.write(sessionCookieFile, JSON.stringify(page.cookies)); 
} 

function restoreCookies(sessionCookieFile, page) { 
    var fs = require("fs"); 
    var cookies = fs.read(sessionCookieFile); 
    page.cookies = JSON.parse(cookies); 
} 

var page = require('webpage').create(); 

Und wenn alles nicht ...

Sie Quellcode herunterladen konnte und recopile PhantomJS

Sie src/cookiejar.cpp und entfernen oder einen Kommentar bearbeiten müssen purgeSessionCookies();

Hoffe, das hilft.

+0

Die Frage gibt keinen Hinweis darauf, ob dies bei wiederholter Ausführung oder in einer einzigen Ausführung geschieht. Daher gehe ich davon aus, dass es sich um eine Einzelausführung handelt. In diesem Fall trifft Ihre Antwort nicht zu. Außerdem beschreibt der Thread, mit dem Sie verlinkt sind, Probleme mit einer ziemlich alten PhantomJS-Version.Ich habe erfolgreich die '--cookies-Datei' verwendet, um" Session-Cookies "(HTTPonly) in PhantomJS 1.9.7 und höher zu speichern. Diese Antwort ist zumindest veraltet. –