PhantomJS 通常将图像渲染到与您正在运行的脚本相同的目录中。所以是的,它应该与您使用 PhantomJS 运行的 JavaScript 文件位于同一目录中。
编辑
看起来那个特定的例子是有缺陷的。问题是page.render(...);
渲染页面需要一些时间,但是您phantom.exit()
在它完成渲染之前调用。通过这样做,我能够获得预期的输出:
var page = require('webpage').create();
page.open('http://google.com', function () {
page.render('google.png');
setTimeout(function() { phantom.exit(); }, 5000) // wait five seconds and then exit;
});
不幸的是,这并不理想,所以我能够想出更好的头发。我说“头发”,因为我基本上是在轮询以查看页面何时完成渲染:
var done = false; //flag that tells us if we're done rendering
var page = require('webpage').create();
page.open('http://google.com', function (status) {
//If the page loaded successfully...
if(status === "success") {
//Render the page
page.render('google.png');
console.log("Site rendered...");
//Set the flag to true
done = true;
}
});
//Start polling every 100ms to see if we are done
var intervalId = setInterval(function() {
if(done) {
//If we are done, let's say so and exit.
console.log("Done.");
phantom.exit();
} else {
//If we're not done we're just going to say that we're polling
console.log("Polling...");
}
}, 100);
上面的代码有效,因为回调没有立即执行。因此轮询代码将启动并开始轮询。然后当回调执行时,我们检查页面的状态(如果我们能够成功加载页面,我们只想渲染)。然后我们渲染页面并将我们的轮询代码正在检查的标志设置为true
. 所以下次轮询代码运行时,标志是true
,所以我们退出。
这似乎是 PhantomJS 运行webpage#render(...)
调用方式的问题。我怀疑这是一个非阻塞调用,但根据本期作者的说法,这是一个阻塞调用。如果我不得不冒险猜测,也许渲染的行为是一个阻塞调用,但是执行渲染的代码可能会将数据移交给另一个线程,该线程处理将数据持久化到磁盘(所以这部分可能是非-阻塞呼叫)。不幸的是,当执行回到主脚本并执行时,这个调用可能仍在执行phantom.exit()
,这意味着前面提到的异步代码永远没有机会完成它正在做的事情。
我能够在 PhantomJS 论坛上找到一篇与您所描述的内容有关的帖子。我看不到任何已提交的问题,因此,如果您愿意,可以继续发布一个。