2014-01-06 146 views
17

我嘗試使用PhantomJS登錄時發現了一個有趣的問題。我不知道爲什麼它實際發生。phantomjs - Cookie未被髮送用於任何XHR/POST/GET AJAX請求

基本上你啓動遠程調試器,像這樣:

/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('[email protected]') 
> $('input[name="password"]').val('wrongpassword') 

> $('button[type="submit"]').submit() 

在Chrome這樣做會給我正確的「密碼錯誤」的消息XHR後請求,而使用phantomjs給我一個通用的錯誤,因爲沒有cookie發送與phantomjs(我檢查了標題)。

我很困惑爲什麼phantomjs不會發送帶有POST請求的cookie。有誰知道我們可以如何讓phantomjs發送所有請求的cookie?設置cookie文件也沒有任何區別。

+0

嘿Geesu,你找到了解決你的問題?我遇到類似的問題。 http://stackoverflow.com/questions/23679287/why-is-the-cookie-header-not-set-on-my-same-domain-ajax-request-within-phantom – Senad

+0

不幸的是,我從來沒有。我剛剛放棄使用phantomjs並開始使用Mechanize gem來僞造請求(就像Net :: HTTP一樣)。 – Geesu

+1

在上面添加了一個賞金 - 我發現了很多線程來解決這個問題,但沒有答案。 HALP! – starsinmypockets

回答

1

好吧,這似乎是與會話cookie相關的東西,而不是正常的cookie。下面是開發者負責phantomjs的cookies功能以及與您相同問題的一些人的一個巨大線索。

https://groups.google.com/forum/#!msg/phantomjs/2UbPkIibnDg/JLV9jBKxhIQJ

,如果你不想在整個文件skirm,基本上是: Phantomjs的行爲像一個普通的瀏覽器,並刪除所有的會話cookie時,瀏覽器關閉,你的情況,當你的腳本執行結束。

因此,即使您設置了--cookies-file =/path/to/cookies.txt選項,您只會在其上存儲常規cookie,以執行子搶救。

有兩種可能的方法給你。一種是在同一個腳本中創建所有請求,另一個是手動存儲和恢復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(); 

而且,如果這些都失敗......

你可以下載源代碼和recopile phantomjs

你需要編輯的src/cookiejar.cpp和刪除或評論purgeSessionCookies();

希望,這有助於。

+0

這個問題並沒有說明這種情況是發生在重複執行還是單次執行中,所以我將假設它是單一執行,在這種情況下,您的答案不適用。此外,您鏈接的線程用一個相當古老的PhantomJS版本來描述問題。我已成功使用'--cookies-file'在PhantomJS 1.9.7及更高版本中存儲「會話cookie」(HTTPonly)。這個答案至少已經過時了。 –