我有一个PhantomJS脚本,我试图使用它来基本上生成特定网站的视频。
var page = require('webpage').create();
page.viewportSize = {
width: 1280,
height: 720
};
page.open('http://my-awesome-site.whatever', function() {
var fps = 30;
var seconds = 10;
var elapsed = 0;
var current = 0;
takeScreenShot();
function takeScreenShot() {
if (elapsed < seconds * 1000) {
page.render('screenshot_' + (current++) + '.png');
elapsed += 1000 / fps;
setTimeout(takeScreenShot, 1000 / fps);
}
else {
phantom.exit();
}
}
});
上面的脚本将尝试每秒拍摄30张截图,持续10秒,然后使用ffmpeg将其合并为mp4。
问题是page.render()函数不是即时的,并且不会暂停在页面上运行的脚本。因此,当我使用jQuery动画指向页面时,我相信它依赖于setTimeout,这些超时会在处理每个屏幕截图时继续运行。结果,输出的视频显着加快了。
有没有办法通过PhantomJS暂停脚本执行?我所希望的是做一些事情:
page.pause();
page.render('screenshot_' + (current++) + '.png');
page.resume();
但遗憾的是,我在他们的api文档中看不到类似内容。
答案 0 :(得分:1)
如果页面看起来不太依赖JS,您可以设置page.settings.javascriptEnabled=false
。
请注意,您需要在第一次调用之前定义设置,因为它们仅被评估一次,例如:
var page = require('webpage').create();
page.settings = {
javascriptEnabled=false
}
请参阅:http://phantomjs.org/api/webpage/property/settings.html
如果它不符合您的需要,您需要深入了解页面代码以找到停止动画的方法(使用浏览器的控制台)。一旦你知道你需要做什么,只需在Phantom中评估命令。
page.open('http://my-awesome-site.whatever', function() {
var stopScripts = page.evaluate(function() {
// do whatever you need to stop execution
return true;
});
// ... take your screenshots
});