casperjs:评估document.querySelector返回null

时间:2013-07-30 18:44:05

标签: javascript dom phantomjs casperjs evaluate

我正在使用CasperJS中的waitForSelector()captureSelector()方法等待并使用CSS选择器选择元素,然后保存它的屏幕截图。

但是,我发现因为css background已设置为transparent,屏幕截图结果非常难看,所以我想将background设置为{ {1}}。我made sure我在evaluate()电话中使用了white,但这似乎不起作用。

这是我的脚本(您可以忽略document.querySelector之前的所有内容,我只是包含了下一个代码段的上下文的开头部分):

casper.start(...

这是我传入url,selector和filename以将屏幕截图写入的输出:

var casper = require("casper").create({
  verbose: true,
  clientScripts: ["libs/jquery-1.10.2.js"]
});
var utils = require("utils");

var requiredOptions = [ 'url', 'selector', 'filename' ];
var missingOptions = new Array();

for (var i = 0 ; i < requiredOptions.length ; i++) {
  var opt =  requiredOptions[i];
  if (!casper.cli.has(opt)) {
    missingOptions.push(opt);
  }
}

if (missingOptions.length > 0) {
  casper.die("\nMissing the following CLI options: " + missingOptions.join(", ") + "\n\nExiting.\n");
}

var url = casper.cli.get('url');
var selector = casper.cli.get('selector');
var filename = casper.cli.get('filename');

casper.start(url, function() {
  this.waitForSelector(selector, function then() {
    var element = this.evaluate(function() {
      return document.querySelector(selector);
    });
    console.log(element); // returns null
    element.style.backgroundColor = "white"; // throws TypeError: 'null' is not an object (evaluating 'element.style') 
    this.captureSelector("captures/" + filename, selector);
  }, function onTimeout() {
    this.die("URL timed out.");
  });
});

casper.run();

注意:是的,我很清楚这个屏幕截图结果很好(背景是白色的)...我只是决定使用任何旧的网址,因为我只是在尝试说明yiqing:~/Repos/rectslice()$ casperjs slice.js --filename='screenshot.png' --url='https://github.com/n1k0/casperjs/issues/192' --selector='.discussion-bubble-inner' null TypeError: 'null' is not an object (evaluating 'element.style') /Users/yiqing/Repos/rectslice/slice.js:31 in then /Users/yiqing/Repos/rectslice:1329 in runStep /Users/yiqing/Repos/rectslice:332 in checkStep 调用不能按预期工作。

另外,不确定版本是否相关,但无论如何它们都是:

document.query()

1 个答案:

答案 0 :(得分:9)

您遇到了问题,因为您无法从evaluate()传回DOM元素。但是,您可以直接使用evaluate块内的元素。

casper.start(url, function() {
  this.waitForSelector(selector, function then() {
    this.evaluate(function(sel) {
      document.querySelector(sel).style.backgroundColor = "white";
    }, selector);
    this.captureSelector("captures/" + filename, selector);
  }, function onTimeout() {
    this.die("URL timed out.");
  });
});

casper.run();

我在CasperJS 1.1-beta1上测试了这个,但它应该适用于版本&gt; = 1.0.0

编辑:可以传回对象,但不传回DOM元素。