我正在研究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();
})
以上输出为:
页面饼干
未定义
完成。
为什么它给我未定义?帮帮我吧。
答案 0 :(得分:1)
评估背后的概念是,您将代码传递给浏览器的控制台并在那里执行您的代码。如果在evaluate方法中定义任何变量,那么变量将是该方法的本地变量。该范围是本地的。当您与Casper打交道时,您应该考虑变量的范围
所以,当你试图打印出来时," cookie"在主要功能中它会说它是未定义的。这是预期的。
请注意,您无法在evaluate方法中使用echo(),console.log()。
cookie = this.evaluate(function() { var cookieLocal=document.cookie; return cookieLocal; })
这里" cookieLocal"是一个局部变量。 这将返回值为Gloabal变量" cookie"。因此,当您尝试在main函数中打印值时,它将按预期工作。我希望这会让你在声明变量时考虑范围。你可以直接返回做返回。无需使用局部变量。
cookie = this.evaluate(function() { return document.cookie; })
使用evaluate方法时,我建议的另一个重要事项。尝试在开发代码时使用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()应该在评估方法之外 希望这将是一个有用的。
答案 1 :(得分:-2)
删除var cookie
cookie = casper.evaluate(function() {
return document.cookie;
})
casper.then(function() {
console.log("Page cookie");
console.log(cookie);
})
上面的代码对我来说很好。