Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does PhantomJS support cookies?

Does PhantomJS support cookies? If yes, where can I find the API details?

I am not able to figure it out after searching for a while now.

like image 521
Niyaz Avatar asked Feb 29 '12 18:02

Niyaz


3 Answers

Yes, as of 1.7 Phantom has complete cookie handling, enabled by default. Cookies are retained for the duration of the process's life.

If you'd like to retain cookies across runs of Phantom, there's a command-line option cookies-file where you can specify where to store persistent cookies.

--cookies-file=/path/to/cookies.txt specifies the file name to store the persistent cookies.

In page script, you can use the regular document.cookie property. Like in browsers, this property returns a string similar to that which would be sent in the Cookie: HTTP header.

In Phantom script, you can access cookies for a page (subject to the usual origin restrictions) via page.cookies, which returns objects.

You can also access all cookies (from all domains) using phantom.cookies.

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
});

To add/edit/delete cookies, use the addCookie, deleteCookie, and clearCookies methods of either a WebPage object or the phantom object.

When you use the methods of a WebPage object, you only modify the cookies that are visible to the page. Access to other domains is blocked.

However, using phantom's cookie methods allow access to all cookies. phantom.addCookie requires a domain (WebPage.addCookie assumes the current domain if you don't specify one), and phantom.deleteCookie deletes any cookie matching the specified name.

like image 163
josh3736 Avatar answered Sep 23 '22 11:09

josh3736


It does, through WebPage.addCookie() - which incidentally doesn't work neither for me nor someone else.

You can use this instead:

phantom.addCookie({
    'name': 'mycookie',
    'value': 'something really important',
    'domain': 'example.com'
})
page.open('http://example.com/url/path/', function() {
    console.log(page.cookies);
})
like image 36
johndodo Avatar answered Sep 21 '22 11:09

johndodo


The work around I had to do was to execute javascript directly. I am using Geb and did the following:

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

When selenium fails I always fall back to javascript for functionality.

like image 21
Derek Carr Avatar answered Sep 21 '22 11:09

Derek Carr