2012-08-08 6 views
30

Perché quando uso console.log in evaluate, funziona:console.log non funziona in CasperJS' valutare con setTimeout

casper.then(function() { 
    this.evaluate(function() { 
    console.log('hello'); 
    }); 
}); 

Ma questo non funziona:

casper.then(function() { 
    this.evaluate(function() { 
    setTimeout(function() {console.log('hello');}, 1000); 
    }); 
}); 
+0

correlati: [uscita console del client-side con Casper/phantomjs] (http://stackoverflow.com/a/10783675/1816580) –

risposta

71

Perché tu stiamo mescolando casperjs e ambienti di pagine remote. La funzione evaluate eseguirà il codice all'interno dell'env della pagina remota, pertanto la chiamata console.log non produrrà alcun risultato.

Se si desidera catturare remoticonsole.log chiamate, ascoltare l'evento remote.message:

casper.on('remote.message', function(msg) { 
    this.echo('remote message caught: ' + msg); 
}) 

Btw, documentation for events è praticamente esaustivo, così come the one for evaluate.

+1

la '' 'setTimeout''' è il differenza tra gli esempi di OP. In che modo '' 'setTimeout''' lo cambi? sono entrambi eseguiti nell'ambiente remoto. –

+0

@nikkwong Poiché l'OP non specificava cosa intendessero per * "funziona" * e * "non funziona" *, possiamo solo indovinare. Penserei che non si siano accorti che stanno uscendo dal flusso di controllo di CasperJS e quindi si sono dimenticati di aspettare anche nel flusso di controllo "casper'. Probabilmente sono usciti troppo presto. Dubito che possiamo arrivare al fondo nonostante l'attività del PO. –

+0

FYI - i collegamenti sono rotti – evolutionxbox

20

@ La risposta di NiKo è fondamentale.

Suggerirei inoltre di aggiungere quanto segue, poiché se si verifica un errore, è possibile che non si riesca nemmeno a stampare abbastanza un file console.log(), e invece si concluda con il silenzio.

casper.on('page.error', function (msg, trace) { 
    this.echo('Error: ' + msg, 'ERROR'); 
}); 
10

CasperJS include ClientUtils, che può essere utilizzato dalla pagina remota per accedere facilmente alla console dello script Casper:

__utils__.echo('This message is logged from the remote page to the CasperJS console'); 
5

Sulla risposta di @ odigity, questo rende casperjs muoiono con un altro familiarità errore/stacktrace:

var util = require('util'); 

casper.on('page.error', function exitWithError(msg, stack) { 
    stack = stack.reduce(function (accum, frame) { 
     return accum + util.format('\tat %s (%s:%d)\n', 
      frame.function || '<anonymous>', 
      frame.file, 
      frame.line 
     ); 
    }, ''); 
    this.die(['Client-side error', msg, stack].join('\n'), 1); 
}); 
+1

Fantastico! Stavo solo cercando qualcosa di simile anche oggi. Tuttavia, il modulo di utilità non dovrebbe essere 'utils'? – Qcom

+0

@ Qcom, penso che 'utils' possa andare bene, dato che è [_'sprintf' equivalent_] (http://casperjs.readthedocs.org/en/latest/modules/utils.html#format). Dove lo stavo usando avevamo già ['util'] (https://www.npmjs.com/package/util), quindi l'ho usato :) – c24w

+0

Interessante, stai usando casper in congiunzione con il nodo tramite SpookyJS o equivalente? A mia conoscenza, casper non si integra con l'ecosistema del modulo nodo per impostazione predefinita. – Qcom

Problemi correlati