All then*
and wait*
functions are scheduling steps to be executed. When CasperJS runs out of steps to execute and no function is passed into casper.run()
, then it will automatically exit.
The easy fix would be to always pass an empty function into casper.run()
and schedule new steps from inside the function:
casper.then(function(){
var p = cp.execFile('/path/parse', [], {}, function(error, stdout, stderr) {
console.log(stdout);
casper.thenOpen(parsedUrl).then(function(){
// do something on page
});
});
});
casper.run(function(){});
A more clean approach would be to write your own step function that wraps the execFile
function:
casper.waitForFileExec = function(process, callback, onTimeout, timeout){
this.then(function(){
var cp = require('child_process'),
finished = false,
self = this;
timeout = timeout === null || this.options.stepTimeout;
cp.execFile(process, [], {}, function(error, stdout, stderr) {
finished = true;
callback.call(self, error, stdout, stderr);
});
this.waitFor(function check(){
return finished;
}, null, onTimeout, timeout);
});
return this; // for builder/promise pattern
};
...
casper.waitForFileExec('/path/parse', function(error, stdout, stderr) {
this.echo(stdout);
this.thenOpen(parsedUrl).then(function(){
// do something on page
});
}).run();
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…