【问题标题】:casperjs: evaluating document.querySelector returns a nullcasperjs:评估 document.querySelector 返回 null
【发布时间】:2013-07-30 18:44:05
【问题描述】:

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

但是,我发现由于 css background 已设置为 transparent,因此屏幕截图非常难看,因此我想将 background 设置为 white。我有made sure,我在evaluate() 通话中使用document.querySelector,但这似乎不起作用。

这是我的脚本(你可以忽略casper.start(... 之前的所有内容,我只是在下一个代码 sn-p 的上下文中包含了开头部分):

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();

这是当我传入 url、选择器和文件名以将屏幕截图写入时得到的输出:

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() 调用没有按预期工作。

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

yiqing:~/Repos/rectslice()$ casperjs --version
1.0.2
yiqing:~/Repos/rectslice()$ phantomjs --version
1.9.0

【问题讨论】:

    标签: javascript dom phantomjs casperjs evaluate


    【解决方案1】:

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

    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 上对此进行了测试,但它应该适用于 >= 1.0.0 的版本

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

    【讨论】:

    • 太棒了,成功了,谢谢!我不知道evaluate() 也不能传回对象,所以直到 :) 现在要弄清楚为什么我的部分截图被截断了:(
    • 您可能想尝试更改viewport size
    • 或一起删除视口大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2021-04-16
    • 1970-01-01
    相关资源
    最近更新 更多