Javascript Casper-理解使用函数回调进行评估
这是一个有点棘手的问题 我对javascript非常熟悉,但是我在一个使用PhantomJS和CasperJS自动抓取网站的项目中。这些对我来说是全新的课题 我能够弄清楚如何使用Casper和导航,登录页面等,但它并不适合一般流程:Javascript Casper-理解使用函数回调进行评估,javascript,phantomjs,Javascript,Phantomjs,这是一个有点棘手的问题 我对javascript非常熟悉,但是我在一个使用PhantomJS和CasperJS自动抓取网站的项目中。这些对我来说是全新的课题 我能够弄清楚如何使用Casper和导航,登录页面等,但它并不适合一般流程: casper.start('http://google.fr/'); casper.then(function() { this.echo("I'm in your google."); }); casper.then(function() {
casper.start('http://google.fr/');
casper.then(function() {
this.echo("I'm in your google.");
});
casper.then(function() {
this.echo('Now, let me write something');
});
casper.then(function() {
this.echo('Oh well.');
});
casper.run();
我的问题是,我想用这个网站做各种各样的事情,这取决于它能得到什么样的数据。我不能预先安排导航的顺序,也不能让它改变。我希望这是有道理的
为了解决这个问题,我创建了一个带有内置函数的Javascript Navigator对象。我的总体概念是:
navigator.logIn(function()
{
navigator.actionA(parameters, function()
{
if (navigator.data.a == navigator.data.b) {
navigator.actionB();
} else {
navigator.actionC();
}
});
});
每个函数中都嵌入了casper函数
下面是我实际代码的一个简短版本,从这里开始,事情变得越来越古怪:
var casper = require('casper').create({
clientScripts: [ 'jquery.min.js' ],
onError: function(self, m) {
console.log('FATAL:' + m);
self.exit();
},
});
var navigator = new _Navigator();
function _Navigator() { }
_Navigator.prototype.logIn = function(aCallback)
{
var self = this;
casper.start('https://website/login.asp', function()
{
if (1 == 1) {
this.evaluate(function() {
$("input[name=blah]").val('blahblah');
});
// ... A LOT MORE CODE
aCallback();
}
});
}
_Navigator.prototype.search = function(aDataSet, aCallback)
{
var self = this;
console.log('this works');
casper.then(function(){
console.log('this works');
});
var firstName = 'foobar';
casper.then(function(){
console.log('this works');
this.evaluate(function()
{
console.log('this no longer works!!');
$('input[id=blah]').val(firstName);
aCallback();
});
});
}
navigator.logIn(function() {
// LOG IN RUNS, AND CALLS BACK SUCCESSFULLY...
navigator.search({'dataset'}, function()
{
console.log('This never runs');
});
});
casper.run();
您会注意到,在navigator.login函数中,我调用casper.start();在这种情况下,求值函数工作正常,但是我在casper.start()中执行回调函数;在回调中,我调用了下一个函数navigator.search,我想它在casper.start中仍然在执行
当我尝试在第一个回调函数调用的这个新函数中运行casper.evaluate时,除了casper.evaluate不再工作之外,一切似乎都正常!它似乎吃掉了这个功能,没有打印任何控制台日志或任何东西
我已经尝试了这一切。我不知道如何正确地做到这一点。有人对我做错了什么有什么建议吗?谢谢。我知道这已经很老了,但是:这里发生的是两个问题的结合:
似乎吃掉了当前堆栈中的所有错误-casper.evaluate()
不会从onError
回调内部运行
中使用的函数不是标准闭包-它们是沙盒,不能访问其作用域之外的变量,除非作为显式参数传递给.evaluate
。因此,在调用casper.evaluate
的求值函数中,作用域中没有aCallback()
,函数将失败(静默),并出现aCallback
ReferenceError
casper.on('remote.message', function(message) {
console.log(message);
});
尝试放置一些日志,以便查看发生了什么。这有助于: