PhantomJS работает асинхронно по умолчанию, что вызывает такие проблемы, как тот, который вы описать выше (где сценарий заканчивается, прежде чем ваши результаты будут готовы)
Однако нет ничего, чтобы остановить вас использовать его в синхронном образом.
Просто используйте phantom.page.sendEvent('mousemove')
в замкнутом цикле. Это приведет к циклическому переходу через насос событий, пока двигатель webkit не загрузит вашу страницу или не обработает все необходимые события браузера.
var page = require('webpage').create();
// Step 1: View item
page.open('http://localhost/item3324.php');
do { phantom.page.sendEvent('mousemove'); } while (page.loading);
page.render('step1-viewitem.png');
// Step 2: Add to cart
page.evaluate(function() {$('#add-to-cart').click(); });
do { phantom.page.sendEvent('mousemove'); } while (page.loading);
page.render('step2-viewcart.png');
// Step 3: Confirm contents
page.evaluate(function() {$('#confirm-cart').click(); });
do { phantom.page.sendEvent('mousemove'); } while (page.loading);
page.render('step3-confirm.png');
Обратите внимание, что page.loading
также может быть любым другим логическим условием, например:
do { phantom.page.sendEvent('mousemove'); }
while (page.evaluate(function() {return $("#panel").is(":visible");}));
Я обнаружил этот подход во время работы над проектом triflejs.org (версия Internet Explorer фантома) пытаемся эмулировать вызовы до trifle.wait(ms)
внутри среды PhantomJS.
глупо решение SetTimeout() – igor