2014-10-10 4 views
1

У меня есть скрипт PhantomJS, который я пытаюсь использовать, чтобы по существу генерировать видео определенного веб-сайта.PhantomJS - pause/resume Выполнение 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 секунд, которые я затем комбинируют в mp4 с помощью FFmpeg.

Проблема в том, что функция page.render() не является мгновенной и не останавливает выполнение скриптов на странице. Поэтому, когда я указываю на страницу с использованием анимаций jQuery, которые, как я полагаю, полагаются на setTimeout, эти тайм-ауты продолжают выполняться при обработке каждого скриншота. В результате выведенное видео очень сильно ускорилось.

Есть ли способ через PhantomJS приостановить выполнение сценария? То, что я надеюсь на это, чтобы сделать что-то вроде:

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

Но, к сожалению, я не вижу ничего подобного в их API Docs.

ответ

1

Вы можете установить page.settings.javascriptEnabled=false, если страница выглядит не слишком сильно зависеть от JS. Имейте в виду, что вам нужно определить параметры до первого вызова, как они вычисляются только один раз, например:

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

+0

вы можете сделать page.open каждые 30 секунд ... – xShirase

Смежные вопросы