2012-02-29 12 views
31

¿Admite PhantomJS cookies? En caso afirmativo, ¿dónde puedo encontrar los detalles de la API?¿PhantomJS admite cookies?

No puedo resolverlo después de buscar por un tiempo.

+0

sí, es compatible con cookies como los navegadores, ¿qué quiere decir con API? –

+0

¿Cómo obtengo el valor de una cookie? document.cookie no parece obtener nada en absoluto. – Niyaz

+1

document.cookie funciona en todos los navegadores excepto en phontomjs, parece ser un error, hay planes para agregar API nativa http://code.google.com/p/phantomjs/issues/detail?id=354&start=100 –

Respuesta

40

Sí, a partir de 1.7 Phantom tiene manejo de cookies completo, habilitado por defecto. Las cookies se conservan durante la vida del proceso.

Si desea conservar las cookies en todas las ejecuciones de Phantom, existe un command-line option cookies-file donde puede especificar dónde almacenar las cookies persistentes.

--cookies-file=/path/to/cookies.txt especifica el nombre del archivo para almacenar las cookies persistentes.

En la secuencia de comandos de la página, puede usar la propiedad normal document.cookie. Al igual que en los navegadores, esta propiedad devuelve una cadena similar a la que se enviaría en el encabezado HTTP Cookie:.

En Phantom script, puede acceder a las cookies de una página (sujeto a las restricciones de origen habituales) a través de page.cookies, que devuelve objetos.

También puede acceder a todas las cookies (de todos los dominios) utilizando 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 
}); 

Para add/edit/delete cookies, utilice las addCookie, deleteCookie, y clearCookies métodos de ya sea un objeto de WebPage o el objeto phantom.

Al utilizar los métodos de un objeto WebPage, sólo se modifican las galletas que son visibles a la página. El acceso a otros dominios está bloqueado.

Sin embargo, el uso de los métodos de cookie phantom permite el acceso a todas las cookies. phantom.addCookie requiere un dominio (WebPage.addCookie asume el dominio actual si no se especifica uno), y phantom.deleteCookie elimina cualquier galletas que coincida con el nombre especificado.

+0

Excepto que cuando hago 'console.log (document.cookie);' la ejecución simplemente se detiene. – Niyaz

+0

@Niyaz sí, lo intenté y se cuelga, presenta un error. –

+0

No cuelga para mí en Windows cuando se usa con una prueba de unidad de jazmín ... pero Phantom vuelve indefinido. –

0

No lo he probado todavía, pero ¿no funciona --cookies-file=/path/to/cookies.txt?

Es el primer elemento de referencia API ...

+0

Sí, escribe las cookies en el archivo especificado. pero ¿cómo recupero el valor de una cookie específica? – Niyaz

+1

sí ... parece que el soporte de cookies no está completo: http://code.google.com/p/phantomjs/issues/detail?id=299 y http://code.google.com/p/phantomjs/ problemas/detalles? id = 91 –

10

Lo hace, a través de WebPage.addCookie() - que por cierto no funciona ni para mí ni someone else.

Puede utilizar este lugar:

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

¿Por qué el voto a favor (anónimo)? Este fragmento muestra otra forma de establecer cookies si el 'WebPage.addCookie()' no funciona por alguna razón. – johndodo

0

había clasificado la información dentro de la sesión recientemente. Debe establecer cookies en el objeto de página, como a continuación (coffeescript):

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

El trabajo que tuve que hacer fue ejecutar javascript directamente.Estoy usando Geb e hice lo siguiente:

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

Cuando falla el selenio, siempre recurro a javascript para la funcionalidad.

Cuestiones relacionadas