我想抓住此页面上的“David Welsh”文字:http://foster.uw.edu/faculty-research/directory/david-welsh/
当我在浏览器控制台中document.getElementById('Boundless').children[0].children[2].children[0].children[1].children[0].innerHTML
时,我成功选择了我想要的文本,但是当我在终端中运行我的js文件时,我收到错误:
TypeError: 'null' is not an object (evaluating 'document.getElementById('Boundless').children')
为什么这在我的浏览器中工作,而不在我的本地js文件中?
casper.then(function(){
this.each(links,function(self,link){
self.thenOpen(link,function(a){
this.echo(this.getCurrentUrl());
var name = document.getElementById('Boundless').children[0].children[2].children[0].children[1].children[0].innerHTML;
casper.echo(name);
}
});
});
});
答案 0 :(得分:4)
CasperJS建立在PhantomJS之上,它有两个上下文。页面上下文(casper.evaluate()
)是沙箱。这是访问DOM的唯一方法,您需要使用它。
var name = casper.evaluate(function(){
return document.getElementById('Boundless').children[0].children[2].children[0].children[1].children[0].innerHTML;
});
casper.echo(name);
你想要在其中使用的所有内容,你必须明确传入。它无法访问外部定义的变量。
PhantomJS documentation也有一些重要的说法:
注意:
evaluate
函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。闭包,函数,DOM节点等将不工作!