2014-03-27 9 views
6

Ich hätte gerne ein CasperJS-Skript, das eine Seite startet und dann unbegrenzt offen bleibt, damit ich Befehle über HTTP senden kann, wann immer ich will. Das Problem ist, dass der gesamte CasperJS-Prozess beendet wird, sobald der Anruf casper.run beendet wird. Ich habe versucht, dies zu umgehen, indem Sie einen langen Anruf wait in einem Schritt, aber dann kann der Webserver nichts mit Casper, weil Casper ist beschäftigt, warten auf den wait Aufruf zu beenden.PhantomJS/CasperJS - Sitzung auf unbestimmte Zeit offen lassen und mit ihr über HTTP interagieren?

var port = 6100; 

var casper = require("casper").create(); 
casper.start("http://google.com"); 
casper.then(function() { 
    // If I include this wait, then the server works, but the 
    // `this.capture` call inside it never executes, presumably 
    // because casper is executing the `then` calls in serial. 
    // But if I don't include this wait, the entire process finishes 
    // instantly and I can't use the server anyway. 
    this.wait(100000000, function() { 
    console.log("i have waited"); 
    }); 
}); 
casper.run(function() { 
    console.log("finished"); 
}); 

var pictureNum = 0; 
require("webserver").create().listen(port, function(request, response) { 
    var src = "my_picture_" + (pictureNum++) + ".png"; 
    response.writeHead(200, { 'Content-Type': 'text/html' }); 
    response.write("written " + src); 
    response.close(); 

    casper.then(function() { 
    // How can I do this whenever I want? 
    this.capture(src); 
    }); 
    casper.run(); // Maybe? 
}); 
console.log("listening on port", port); 

Gibt es eine Möglichkeit, Casper einfach offen zu halten und Befehle an sie zu senden?

EDIT: stellt sich heraus, ich kann dies ganz einfach mit rohen PhantomJS tun, nur indem Sie 10 nicht anrufen. Das funktioniert perfekt als PhantomJS Skript:

var port = 6100; 

var page = require("webpage").create(); 
page.open("http://google.com", function() { }); 

var pictureNum = 0; 
require("webserver").create().listen(port, function(request, response) { 
    var src = "my_picture_" + (pictureNum++) + ".png"; 
    response.writeHead(200, { 'Content-Type': 'text/html' }); 
    response.write("written " + src); 
    response.close(); 
    page.render(src); 
}); 
console.log("listening on port", port); 

Aber meine Frage bleibt, wie die gleiche Sache zu tun, während auch die Vorteile der CasperJS der Nettigkeit nehmen.

Antwort

13

Endlich etwas Vernünftiges!

Es gibt eine onRunComplete Einstellung, die standardmäßig this.exit aufruft. Wenn Sie es mit einer Funktion überschreiben, die nichts bewirkt, wird der Prozess nicht beendet, wenn run beendet wird. Dann kannst du wieder then und run anrufen und die Aufgaben werden einfach funktionieren. Vollständiges Beispiel:

var port = 6100; 

var casper = require("casper").create({ 
    onRunComplete: function() { 
    // Don't exit on complete. 
    } 
}); 
casper.start("http://google.com"); 
casper.run(function() { 
    console.log("finished"); 
}); 

var pictureNum = 0; 
require("webserver").create().listen(port, function(request, response) { 
    var src = "my_picture_" + (pictureNum++) + ".png"; 
    response.writeHead(200, { 'Content-Type': 'text/html' }); 
    response.write("written " + src); 
    response.close(); 

    // HACK: without this, the `run()` call will re-execute all 
    // the previous steps too! 
    casper.steps = []; 
    casper.step = 0; 

    casper.then(function() { 
    this.capture(src); 
    }); 
    casper.run(); 
}); 
console.log("listening on port", port); 
Verwandte Themen