CasperJS waitForSelector工作但querySelector为null

时间:2015-08-29 09:34:50

标签: javascript phantomjs casperjs

我正在使用CasperJS,我可以从waitForSelector获得“成功”但是当我尝试为同一个选择器执行document.querySelector时 - 它返回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();

2 个答案:

答案 0 :(得分:2)

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

您只能通过casper.evaluate()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()

答案 1 :(得分:2)

CasperJs中的

document.querySelector在DOM上下文中工作。要使用任何DOM请求,请使用casper.evaluate()this.evaluate。此外,在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");
    }
);