2014-10-10 169 views
1

我有一個PhantomJS腳本,我試圖用它來基本上生成特定網站的視頻。PhantomJS - 暫停/恢復JavaScript執行

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

如果頁面看起來不太依賴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 
}); 
+0

禁用JavaScript將不起作用,因爲我需要在屏幕截圖之間恢復執行。您的第二個建議可能會起作用,我可以在頁面上放置某種全局暫停/恢復功能,但在這一點上添加很多內容。我希望有一個更簡單的方法。 – Danny 2014-10-10 04:24:41

+0

你可以做一個頁面,每30秒打開一次... – xShirase 2014-10-10 04:32:22