【问题标题】:Does PhantomJS support cookies?PhantomJS 支持 cookie 吗?
【发布时间】:2012-03-19 06:31:49
【问题描述】:

PhantomJS 是否支持 cookie?如果是,我在哪里可以找到 API 详细信息?

现在搜索了一段时间后我无法弄清楚。

【问题讨论】:

  • 是的,它支持类似cookie的浏览器,API是什么意思?
  • 如何获取 cookie 的值? document.cookie 似乎什么也没得到。
  • document.cookie 适用于除 phontomjs 之外的所有浏览器,似乎有些 bug,有计划添加原生 API code.google.com/p/phantomjs/issues/detail?id=354&start=100

标签: javascript cookies phantomjs


【解决方案1】:

是的,从1.7 Phantom 开始,默认启用完整的 cookie 处理。 Cookie 会在进程的生命周期内保留。

如果您想在 Phantom 运行期间保留 cookie,可以使用command-line option cookies-file 指定存储持久性 cookie 的位置。

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

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

在 Phantom 脚本中,您可以通过 page.cookies 访问页面的 cookie(受通常的来源限制),它返回 objects

您还可以使用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
});

对于add/edit/delete cookies,使用WebPage 对象或phantom 对象的addCookiedeleteCookieclearCookies 方法。

当您使用WebPage 对象的方法时,您只修改页面可见的cookie。对其他域的访问被阻止。

但是,使用phantom 的 cookie 方法允许访问 所有 cookie。 phantom.addCookie 需要一个域(如果您不指定,WebPage.addCookie 假定为当前域),phantom.deleteCookie 删除与指定名称匹配的 任何 cookie。

【讨论】:

  • 除了当我执行console.log(document.cookie); 时,执行就会停止。
  • 与 jasmine 单元测试一起使用时不会在 Windows 上挂起...但 Phantom 确实返回未定义。
  • @Niyaz:Cookie 已在 1.7 中修复,document.cookie 现在可以使用。查看修改。
  • +1 for phantom.addCookie/deleteCookie,这可以跨域工作,省去很多麻烦
  • 请注意,由于a bug,命令行选项目前在 2.x 中不起作用。
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

通过WebPage.addCookie() 确实如此 - 顺便说一下对我和someone else 都不起作用

您可以改用这个:

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() 由于某种原因无法工作,此 sn-p 显示了另一种设置 cookie 的方法。
  • 我在我的节点模块 phantomjs-prebuilt 中找不到 addCookie 方法,我该如何找到它?
  • 抱歉,帮不了你 - 我建议你再问一个问题,其他人可能知道答案。
  • 但是您如何参考您用于回答的方法?
  • 它存在,请点击答案中的链接:phantomjs.org/api/webpage/method/add-cookie.html 不幸的是,我没有足够的关于您的问题的信息来帮助您,而且我已经好几年没有接触过 PhantomJS...抱歉.如果您需要帮助,您真的需要单独提出一个问题。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    我必须做的工作是直接执行 javascript。我正在使用 Geb 并执行了以下操作:

    js.exec("document.cookie='PHPSESSID=${cookie}';")
    

    当 selenium 失败时,我总是使用 javascript 来获取功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 2013-10-14
      • 2016-01-20
      • 2018-01-20
      • 2013-03-31
      相关资源
      最近更新 更多