2015-07-20 71 views
0

我正在casperjs上工作。我寫下面的程序來獲得輸出:casperjs評估功能不起作用

var casper = require('casper').create(); 
var cookie; 
casper.start('http://wordpress.org/'); 
casper.then(function() { 
     this.evaluate(function() { 
      cookie=document.cookie; 
     }) 
    }) 

casper.then(function() { 
console.log("Page cookie"); 
console.log(cookie); 
}) 
casper.run(function() { 
this.echo('Done.').exit(); 
}) 

輸出上面是:
網頁的Cookie
不確定
完成。

爲什麼它給我undefined?幫我介紹一下。

+0

[CasperJS傳遞變量來評估的可能重複無法使其工作](http://stackoverflow.com/questions/22597987/casperjs-passing-variable-to-evaluate-cant-get-it-to - ) –

+0

這是另一個重複:[如何設置一個變量從casper.evaluate()?](http://stackoverflow.com/questions/30091901/how-do-i-set-a-variable-from -casper-evaluate) –

回答

-2

刪除變種餅乾

 cookie = casper.evaluate(function() { 
       return document.cookie; 
     }) 
     casper.then(function() { 
       console.log("Page cookie");  
       console.log(cookie);   
     }) 

上面的代碼爲我工作得很好。

+0

爲什麼?上面的代碼爲我工作,讓我們討論一下真正的問題 –

1

評估背後的概念是,你會將你的代碼傳遞給瀏覽器的控制檯並在那裏執行你的代碼。如果您在評估方法中定義了任何變量,則該變量將在該方法中是局部的。這個範圍是本地的。當你與卡斯帕打交道時,你應該考慮變量的範圍。
所以當你試圖在主函數中打印出「cookie」時,它會說它是未定義的。這是預期的。
請注意,您無法使用echo(),console.log()內部評估方法。

cookie = this.evaluate(function() { var cookieLocal=document.cookie; return cookieLocal; })

這裏的 「cookieLocal」 是一個局部變量。 這將返回值到全局變量「cookie」。因此,當您嘗試在主函數中打印該值時,它將按預期工作。我希望這會讓你在聲明變量時考慮範圍。你可以直接退貨做退貨。不需要使用局部變量。

cookie = this.evaluate(function() { return document.cookie; })

另一個重要的事情,我當你使用評估方法建議。嘗試在開發代碼時使用Try catch方法。它不會在生產中按照您的要求。我們無法在控制檯內打印任何內容。所以使用try catch來進行調試。

casper.then(function() { cookie = this.evaluate(function() { try { return document.cookie; } catch (e) { return e; } }) this.echo (JSON.stringify ('cookie :'+cookie)); })

注意this.echo()應該是外評估方法。
希望這將是一個有益的。