如何从casper.evaluate()设置变量?

时间:2015-05-07 04:24:39

标签: javascript phantomjs casperjs

我试图在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

1 个答案:

答案 0 :(得分:2)

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

如果您取消注释console.log内的evaluate行,您会看到evaluate崩溃和刻录,因为该变量不存在。

因此,您只能通过evaluate参数传递值并返回值(并且只返回JSON可序列化的值):

isArticleOrReview = this.evaluate(function() {
  return (jQuery('body').hasClass('node-type-review') || jQuery('body').hasClass('node-type-article'));
});