幽灵JS支持cookies吗?

35

PhantomJS 支持 cookie 吗?如果支持,API 细节在哪里可以找到?

我已经搜索了一段时间,但仍然无法弄清楚。


是的,它支持类似浏览器的cookie。您所说的API是什么意思? - Anurag Uniyal
如何获取cookie的值?document.cookie似乎根本没有获取到任何内容。 - Niyaz
1
document.cookie在除了phantomjs之外的所有浏览器中都有效,似乎存在一些bug,计划新增本机API http://code.google.com/p/phantomjs/issues/detail?id=354&start=100。 - Anurag Uniyal
5个回答

45

是的,从1.7版本开始,Phantom具有完整的Cookie处理功能,默认情况下启用。Cookie将保留在进程的生命周期内。

如果您想在Phantom的多次运行中保留Cookie,则可以使用命令行选项cookies-file指定持久Cookie的存储位置。

--cookies-file=/path/to/cookies.txt指定要存储持久Cookie的文件名。

在页面脚本中,您可以使用常规的document.cookie属性。与浏览器一样,此属性返回类似于将在Cookie: HTTP头部发送的字符串。

在Phantom脚本中,您可以通过page.cookies访问页面的Cookie(受常规来源限制),该属性返回对象

您还可以使用phantom.cookies访问所有 Cookie(来自所有域)。

var page = require('webpage').create();
page.open('http://example.com', function (status) {
    page.evaluate(function() {
        document.cookie; // => "test=test-value;"
    });
    page.cookies; // => [{
                  //   domain: "example.com",
                  //   expires: "Wed, 08 Jan 2014 00:00:00 GMT"
                  //   httponly: false,
                  //   name: "test",
                  //   path: "/",
                  //   secure: false,
                  //   value: "test-value"
                  // }]
    phantom.cookies; // contains ALL cookies in Phantom's jar
});

添加/编辑/删除 cookies,请使用WebPage对象或phantom对象的addCookiedeleteCookieclearCookies方法。
当您使用WebPage对象的方法时,您只能修改页面可见的 cookies。对其他域名的访问将被阻止。
但是,使用phantom的 cookie 方法允许访问所有cookies。phantom.addCookie需要一个域名(如果您没有指定域名,WebPage.addCookie会假设当前域名),phantom.deleteCookie会删除匹配指定名称的任何cookie。

除了当我执行 console.log(document.cookie); 时,程序就会停止。 - Niyaz
当我在Windows上与Jasmine单元测试一起使用时,它不会挂起...但是Phantom返回未定义。 - Will Hancock
@Niyaz:Cookies在1.7中已经修复,document.cookie现在可以正常使用了。请查看修改记录。 - josh3736
1
+1 对于 phantom.addCookie/deleteCookie,跨域名的工作方式可以节省很多麻烦。 - chillitom
请注意,由于一个错误,命令行选项目前在2.x版本中无法使用。 - Bob
显示剩余2条评论

13

它可以通过WebPage.addCookie()来实现,顺便提一句,这个功能对我和其他人都不起作用。

您可以使用以下内容代替:

phantom.addCookie({
    'name': 'mycookie',
    'value': 'something really important',
    'domain': 'example.com'
})
page.open('http://example.com/url/path/', function() {
    console.log(page.cookies);
})

为什么会有(匿名的)踩?如果WebPage.addCookie()由于某些原因无法工作,此代码片段展示了另一种设置cookie的方法。 - johndodo
我在我的Node模块phantomjs-prebuilt中找不到addCookie方法,该如何获取它? - EugenSunic
抱歉,我无法帮助您解决这个问题 - 我建议您提出另一个问题,也许其他人会知道答案。 - johndodo
但是你是如何引用你在答案中使用的方法的? - EugenSunic
它存在,按照答案中的链接前往:http://phantomjs.org/api/webpage/method/add-cookie.html。不幸的是,我没有足够的信息来帮助你,而且我已经好几年没有接触PhantomJS了...抱歉。如果您需要帮助,确实需要提出一个单独的问题。 - johndodo
确实是这样,但在我的2+版本中,我在node_modules中看不到它,非常有趣... - EugenSunic

1
我需要做的是直接执行JavaScript。 我正在使用Geb,以下是我的操作:
js.exec("document.cookie='PHPSESSID=${cookie}';")

当Selenium失败时,我总是退而求其次使用JavaScript来实现功能。

0

最近我在会话中对信息进行了评分。您应该在页面对象中设置cookie,如下所示(coffeescript):

@page.clearCookies()
@page.addCookie
  'name'     : "JSESSIONID"
  'value'    : "0000rN3YAlVAU0xdHkKc6BEzWj9:-1"
  'domain'   : 'some.domain.com'
  'path'     : '/'

0

我还没有尝试过,但是--cookies-file=/path/to/cookies.txt不起作用吗?

这是API参考文档中的第一项...


1
是的,它会将cookie写入指定的文件。但是我如何获取特定cookie的值呢? - Niyaz
1
是的...看起来cookie支持不完整:http://code.google.com/p/phantomjs/issues/detail?id=299和http://code.google.com/p/phantomjs/issues/detail?id=91 - Pooria Azimi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接