PhantomJS działa asynchronicznie domyślnie, co powoduje problemy, takie jak ta, którą opisujemy powyżej (gdzie skrypt kończy zanim wyniki są gotowe)
Jednak nic nie powstrzyma cię używania go w sposób synchroniczny.
Po prostu użyj phantom.page.sendEvent('mousemove')
w pętli while. Zapętli się przez pompę zdarzeń, dopóki silnik webkitów nie załaduje strony lub nie przetworzy koniecznych zdarzeń przeglądarki.
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');
Zauważ, że page.loading
może być także każdy inny stan logiczną, na przykład:
do { phantom.page.sendEvent('mousemove'); }
while (page.evaluate(function() {return $("#panel").is(":visible");}));
odkryłem to podejście podczas pracy nad projektem triflejs.org (wersja Internet Explorer od fantomu) próbuje naśladować połączeń do trifle.wait(ms)
w środowisku PhantomJS.
głupie rozwiązanie jest setTimeout() – igor