我有吼叫班:
var CasperInstance = function(casper) {
this.casper = casper;
var x = casper.selectXPath;
var parent = this;
this.then = function(callback) {
return this.casper.then(function() {
parent.casper.evaluate(function() {
try {
x('//*[@id="email_address"]');
} catch (err) {
//ReferenceError: Can't find variable: x
console.log(err);
}
});
});
};
};
当我尝试调用x()时,我收到此错误:ReferenceError: Can't find variable: x
。
然而x是全局变量,我可以从任何嵌套函数访问。对吗?
谢谢
答案 0 :(得分:1)
使用Casper
等内容时,这是一个常见问题。
通常,javascript函数会在闭包中捕获x
,并且该范围内的函数可以使用它。这就是它应该在这里发生的事情。但问题是casper.evaluate()
明确地避免了这一点 - evaluate()
的意思是使用当前页面DOM的上下文。这意味着您只能访问页面范围。在这一点上,文档实际上非常好:
http://docs.casperjs.org/en/latest/modules/casper.html#evaluate
您无法将功能传递到casper.evaluate
。 evaluate()
基本上是调用phantomjs的evaluate()
,所以他们的docs很有用:
注意:evaluate函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。
所以你有点困难,需要找到一种不同的方法来做到这一点。
答案 1 :(得分:0)
x
不是全局变量,它是casperInstance
函数的本地变量。我建议
this.casper.selectXPath('//*[@id="email_address"]');