PhantomJS - 暂停/恢复javascript执行

时间:2014-10-10 04:06:28

标签: javascript jquery webkit jquery-animate phantomjs

我有一个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文档中看不到类似内容。

1 个答案:

答案 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
});