我正在使用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();
答案 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)
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");
}
);