2013-10-05 13 views
20

sto valutando phantom.js e zombie.js. Mi aspettavo il trade-off di essere quel fantasma ha un più ampio supporto di documenti (in quanto utilizza un vero e proprio renderer) mentre zombie è più veloce (dal momento che nessun motore di rendering è utilizzato). Tuttavia zombie sembra molto più lento nel test che ho fatto. Ha senso ciò?prestazioni di phantom.js vs zombie.js

Sto pensando forse di zombie attende l'intera pagina per caricare prima della visita() restituisce (tra cui l'esecuzione di tutti gli script e loadsing CSS), mentre i rendimenti fantasma immediatelly dopo l'avvio() (io ho usato casperjs) che mi permette di continuare senza attendere l'intera pagina.

Phantom.js

casper.userAgent("Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.98 Safari/534.13"); 

casper.test.begin('bing search', 2, function(test) { 
    casper.start('http://www.bing.com/', function() { 
     this.waitUntilVisible('#sb_form_q', function() { 
      this.sendKeys('#sb_form_q', "book", true); 
      this.click('#sb_form_go'); 
      this.waitUntilVisible('#count', function() {   
       var val = this.evaluate(function() { 
        return document.getElementById('count').innerText 
       }); 

       console.log(val) 
      }); 
     }); 
    }).run(function() { 
     test.done(); 
    }); 
}); 

Zombie.js

var Browser = require("zombie"); 
var browser = new Browser() 

browser.userAgent = "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.98 Safari/534.13" 

browser.visit("http://www.bing.com/", function() { 
    browser.fill("#sb_form_q", "book"); 
    browser.pressButton("#sb_form_go"); 

    function resultArrived(window) { 
     return window.document.querySelector("#count") 
    } 

    browser.wait(resultArrived, function() { 
     console.log(browser.document.querySelector("#count").innerHTML)    
    }); 
}); 

risposta

12

non sono sicuro perché non stai utilizzando la sintassi promesse di zombie (come si fa con Casper)? Si dovrebbe fare qualcosa di simile:

browser.fill(...) 
    .then(browser.pressButton) 
    .then(something else) 

non utilizzando la sintassi promesse può causare tutti i tipi di strani effetti, dal momento che l'ordine di esecuzione in un'API asincrona è diverso dall'alto verso il basso di codice a cui siete abituati a linguaggi di script .

per la tua domanda, non posso essere completamente sicuro, ma dalla mia esperienza zombie.js e capser.js (in cima a phantom.js) sono abbastanza simili in termini di velocità. Si noti inoltre che i documenti di zombie.js dichiarano che:

Per attendere che la pagina carichi completamente ed elabori gli eventi, si passa a visitare una funzione di richiamata.

Dal momento che si fa passare una richiamata, si ottiene quello che si aspetta - in attesa di pieno carico pagina.