【问题标题】:CasperJS: evaluate() returns null value [duplicate]CasperJS:评估()返回空值
【发布时间】:2017-08-11 14:30:21
【问题描述】:

举个例子,为什么是categoryIdnull

var scripts = this.evaluate(function() {
    var raScripts = "A lengthy script";

    return raScripts;
});

var categoryId = this.evaluate(function() {
    var text = 'more text';
    var lengthyScript = scripts + ' ' + text;

    return lengthyScript;
});

this.echo('Status: ' + categoryId);
// categoryId is null

【问题讨论】:

  • 变量scripts在页面上下文之外定义,但在内部使用。
  • 我如何在this.evaluate 函数之外使用raScripts 变量?
  • 您已经通过从 evaluate 回调中返回它来做到这一点。 raScripts 的值等于scripts 的值(如果该值是没有循环引用的原始对象)。您只需要将 script 的值传递回页面上下文,以便在页面上下文中进行下一次“计算”。

标签: javascript phantomjs casperjs


【解决方案1】:

我认为这是因为您的 scripts 变量未在浏览器环境中定义(它仅在您的 Casper 环境中定义)。事实上,当您使用evaluate 时,上下文是 DOM,而不是 Casper 实例。

这将返回null:

var casper = require('casper').create();
var tag = 'h1'; // This is our global variable...

casper.start('http://example.com/');

casper.waitForSelector('body', function () {
  this.echo(this.evaluate(function () {
    return document.querySelector(tag).textContent; // Oops!
  }));
});

casper.run();

但是如果我们在evaluate 的上下文中注入我们的变量,我们会得到预期的结果(即“示例域”):

var casper = require('casper').create();

casper.start('http://example.com/');

casper.waitForSelector('body', function () {
  this.echo(this.evaluate(function (tag) {
    return document.querySelector(tag).textContent;
  }, 'h1'));
});

casper.run();

【讨论】:

  • 感谢您的评论,但我真的无法理解您的示例。 scripts 变量确实返回“一个冗长的脚本”。我的问题是 categoryId 变量。它返回 null 而不是“A longy script more text”,尽管它与 scripts 变量的逻辑相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
相关资源
最近更新 更多