CasperJS waitForSelector 有效但 querySelector 为空

CasperJS waitForSelector works but querySelector null

我正在使用 CasperJS,我可以从 waitForSelector 得到一个 "success" 但是当我尝试为同一个选择器做 document.querySelector - 它 returns null?

我的代码

"use strict";
var casper = require('casper').create({
    verbose: false,
    logLevel: 'warning',
    waitTimeout: 10000
});
phantom.cookiesEnabled = true;

var x = require('casper').selectXPath;
casper.options.viewportSize = {width: 1920, height: 965};
casper.on('page.error', function(msg, trace) {
   this.echo('Error: ' + msg, 'ERROR');
   for(var i=0; i<trace.length; i++) {
       var step = trace[i];
       this.echo('   ' + step.file + ' (line ' + step.line + ')', 'ERROR');
   }
});

var selector = ".table-component";
casper.waitForSelector(selector,
    function success() {
        console.log("table found");
        console.log(document.querySelector(selector));      
    },
    function fail() {
        console.log("oops");
    }
);
casper.run();

PhantomJS 有两个上下文,由于 CasperJS 构建在 PhantomJS 之上,它继承了这一事实。

您只能通过 casper.evaluate() (wrapper around page.evaluate() 访问 DOM。所有将选择器作为参数的 CasperJS 函数,在内部使用 evaluate()。请注意,evaluate() 是沙箱化的,您只能将原始类型传入和传出它。 DOM 元素不是原始类型,因此您不能将它们传递到页面 (DOM) 上下文之外。您必须将您想要的信息的某种 表示 作为原始类型传递:

casper.waitForSelector(selector,
    function success() {
        this.echo("table found");
        this.echo("1: "+this.evaluate(function(sel){
            return !!document.querySelector(sel)
        }, selector));
        this.echo("2: "+this.evaluate(function(sel){
            return document.querySelector(sel).textContent;
        }, selector));
    },
    function fail() {
        console.log("oops");
    }
);

我建议您查看其他有用的函数,例如 casper.getElementInfo()

CasperJs 中的

document.querySelector 在 DOM 上下文中工作。要使用任何 DOM 请求,请使用 casper.evaluate()this.evaluate。此外,声明在评估函数范围之外的变量需要以某种方式传递,如下所示。

var selector = ".table-component";
casper.waitForSelector(selector,
    function success() {
        console.log("table found");
        var temp=this.evaluate(function(slctr){
            return document.querySelector(selector);
        },selector);
        console.log(temp);
    },
    function fail() {
        console.log("oops");
    }
);