【问题标题】:PhantomJS - pause/resume javascript executionPhantomJS - 暂停/恢复 javascript 执行
【发布时间】:2014-10-10 04:06:27
【问题描述】:

我有一个 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();
        }
    }
});

上述脚本将尝试在 10 秒内每秒截取 30 张屏幕截图,然后我使用 ffmpeg 将其合并为一个 mp4。

问题在于 page.render() 函数不是即时的,并且不会停止页面上运行的脚本。因此,当我使用 jQuery 动画(我相信它依赖于 setTimeout)指向页面时,这些超时会在处理每个屏幕截图时继续运行。结果,输出的视频看起来大大加快了。

有没有办法通过 PhantomJS 暂停脚本执行?我希望做的是:

page.pause();
page.render('screenshot_' + (current++) + '.png');
page.resume();

但遗憾的是,我在他们的 api 文档中没有看到类似的内容。

【问题讨论】:

    标签: javascript jquery webkit jquery-animate phantomjs


    【解决方案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
    });
    

    【讨论】:

    • 禁用 javascript 不起作用,因为我需要在屏幕截图之间恢复执行。您的第二个建议可能有效,我可以在页面上放置某种全局暂停/恢复功能,但此时需要添加很多内容。我希望有一个更简单的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多