Cookies phantomjs-未针对任何XHR/POST/GET AJAX请求发送Cookie

Cookies phantomjs-未针对任何XHR/POST/GET AJAX请求发送Cookie,cookies,xmlhttprequest,phantomjs,Cookies,Xmlhttprequest,Phantomjs,我在尝试使用PhantomJS登录时发现了一个有趣的问题。我不知道它为什么会发生 基本上,您可以这样启动远程调试器: /usr/local/bin/phantomjs --web-security=no --remote-debugger-port=13379 --remote-debugger-autorun=yes /tmp/test.js 在远程调试器中: > location.href = "https://www.mysite.com/login" > $('input

我在尝试使用PhantomJS登录时发现了一个有趣的问题。我不知道它为什么会发生

基本上,您可以这样启动远程调试器:

/usr/local/bin/phantomjs --web-security=no --remote-debugger-port=13379 --remote-debugger-autorun=yes /tmp/test.js 
在远程调试器中:

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

> $('button[type="submit"]').submit()
在Chrome中这样做会在XHR请求后给我正确的“错误密码”消息,而使用phantomjs会给我一个一般错误,因为phantomjs没有发送cookie(我检查了标题)


我很困惑为什么phantomjs不在POST请求中发送cookie。有人知道如何让phantomjs发送包含所有请求的cookie吗?设置cookie文件也没有任何区别。

好的,这似乎与会话cookie有关,而不是常规cookie

这里有一个关于负责phantomjs的Cookie特性的开发人员和一些与你有相同问题的人的大帖子

如果不想快速浏览整个文件,基本上: Phantomjs的行为类似于普通浏览器,在您的情况下,当脚本执行结束时,它会在浏览器关闭时删除所有会话cookie

因此,即使您设置了--cookies file=/path/to/cookies.txt选项,您也只会在其上存储常规cookies,以供后续执行

你有两种可能的方法。一种是在同一脚本中发出所有请求,另一种是手动存储和恢复cookie

在线程上,有两个函数可用于执行此操作

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();
如果一切都失败了

您可以下载源代码并重新编译phantomjs

您需要编辑src/cookiejar.cpp并删除或注释
purgessioncookies()


希望,这会有帮助。

嘿,Geesu,你找到解决问题的方法了吗?我也遇到了类似的问题。不幸的是,我从来没有这样做过。我只是放弃了使用phantomjs,开始使用Mechanize gem来伪造请求(就像Net::HTTP一样)。在上面添加了一个悬赏——我发现有很多线程解决了这个问题,但没有答案。停!这个问题没有说明这是在重复执行还是在一次执行中发生的,所以我假设这是在一次执行中发生的,在这种情况下,你的答案不适用。此外,您链接到的线程描述了一个非常旧的PhantomJS版本的问题。我已经成功地使用
--cookies文件
在PhantomJS 1.9.7及更高版本中存储了“会话cookies”(HTTPonly)。这个答案至少已经过时了。