gpt4 book ai didi

javascript - PhantomJS/CasperJS - 无限期地保持 session 打开并通过 HTTP 与其交互?

转载 作者:数据小太阳 更新时间:2023-10-29 04:31:04 25 4
gpt4 key购买 nike

我想要一个 CasperJS 脚本来启动一个页面,然后无限期地保持打开状态,这样我就可以随时通过 HTTP 向它发送命令。问题是整个 CasperJS 进程在 casper.run 调用完成后立即关闭。我尝试通过在一个步骤中使用长时间的 wait 调用来解决这个问题,但是随后 Web 服务器无法对 Casper 执行任何操作,因为 Casper 正忙于等待 wait 调用完成。

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);

有什么方法可以让 Casper 保持打开状态并像这样向它发送命令吗?

编辑:原来我可以很容易地用原始 PhantomJS 做到这一点,只是不调用 exit。这可以完美地用作 PhantomJS 脚本:

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);

但我的问题仍然是如何在利用 CasperJS 的优点的同时做同样的事情。

最佳答案

终于找到了合理的东西!

有一个 onRunComplete 设置,默认调用 this.exit。如果您使用不执行任何操作的函数覆盖它,那么当 run 完成时,该进程将不会终止。然后您可以再次调用 thenrun 任务将正常运行。完整示例:

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);

关于javascript - PhantomJS/CasperJS - 无限期地保持 session 打开并通过 HTTP 与其交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22675985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com