如何从 casper.evaluate() 设置变量?
How do I set a variable from casper.evaluate()?
我正在尝试从 casper.evaluate() 中设置一个值,稍后我将检查该值以 运行 进行测试,但它似乎不起作用。
isArticleOrReview = false;
casper.waitFor(function check() { //here I'm just waiting for jQuery to load
return this.evaluate(function() {
return jQuery.fn.jquery == '1.2.6';
});
}, function then() { //once jQuery has been loaded, do this stuff
this.evaluate(function() {
isArticleOrReview = (jQuery('body').hasClass('node-type-review') || jQuery('body').hasClass('node-type-article'));
__utils__.echo('isArticleOrReview ' + isArticleOrReview);
});
});
casper.then(function(){
casper.test.info('isArticleOrReview ' + isArticleOrReview);
});
对于输出我得到:
isArticleOrReview true
isArticleOrReview false
我想这样读:
isArticleOrReview true
isArticleOrReview true
evaluate
已被沙盒化。评估函数无法访问周围代码,周围代码也无法访问评估函数。这是一个来自 PhantomJS 的更简单的例子(Casper 的 evaluate
在下面使用它):
var page = require('webpage').create();
page.open('http://google.com/', function(status) {
var titleVar = "NOT SET";
var titleReturn = page.evaluate(function() {
// This would result in an error:
// console.log('Variable in evaluate:', titleVar);
// ReferenceError: Can't find variable: titleVar
titleVar = document.title;
return document.title;
});
console.log('Return value from evaluate:', titleReturn);
console.log('Variable post evaluate:', titleVar);
phantom.exit();
});
如您所见,这将打印
Return value from evaluate: Google
Variable post evaluate: NOT SET
如果您取消注释 evaluate
中的 console.log
行,您将看到 evaluate
崩溃并烧毁,因为该变量不存在。
因此,您只能通过 evaluate
参数和 return 值传递值(并且只能传递 JSON-可序列化的值):
isArticleOrReview = this.evaluate(function() {
return (jQuery('body').hasClass('node-type-review') || jQuery('body').hasClass('node-type-article'));
});
我正在尝试从 casper.evaluate() 中设置一个值,稍后我将检查该值以 运行 进行测试,但它似乎不起作用。
isArticleOrReview = false;
casper.waitFor(function check() { //here I'm just waiting for jQuery to load
return this.evaluate(function() {
return jQuery.fn.jquery == '1.2.6';
});
}, function then() { //once jQuery has been loaded, do this stuff
this.evaluate(function() {
isArticleOrReview = (jQuery('body').hasClass('node-type-review') || jQuery('body').hasClass('node-type-article'));
__utils__.echo('isArticleOrReview ' + isArticleOrReview);
});
});
casper.then(function(){
casper.test.info('isArticleOrReview ' + isArticleOrReview);
});
对于输出我得到:
isArticleOrReview true
isArticleOrReview false
我想这样读:
isArticleOrReview true
isArticleOrReview true
evaluate
已被沙盒化。评估函数无法访问周围代码,周围代码也无法访问评估函数。这是一个来自 PhantomJS 的更简单的例子(Casper 的 evaluate
在下面使用它):
var page = require('webpage').create();
page.open('http://google.com/', function(status) {
var titleVar = "NOT SET";
var titleReturn = page.evaluate(function() {
// This would result in an error:
// console.log('Variable in evaluate:', titleVar);
// ReferenceError: Can't find variable: titleVar
titleVar = document.title;
return document.title;
});
console.log('Return value from evaluate:', titleReturn);
console.log('Variable post evaluate:', titleVar);
phantom.exit();
});
如您所见,这将打印
Return value from evaluate: Google
Variable post evaluate: NOT SET
如果您取消注释 evaluate
中的 console.log
行,您将看到 evaluate
崩溃并烧毁,因为该变量不存在。
因此,您只能通过 evaluate
参数和 return 值传递值(并且只能传递 JSON-可序列化的值):
isArticleOrReview = this.evaluate(function() {
return (jQuery('body').hasClass('node-type-review') || jQuery('body').hasClass('node-type-article'));
});