2012-08-08 12 views
30

Por qué cuando uso console.log en evaluate, funciona:console.log no funciona en CasperJS' evaluar con setTimeout

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

Pero esto no funciona:

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

relacionadas: [consola del lado del cliente de salida con Casper/PhantomJS] (http://stackoverflow.com/a/10783675/1816580) –

Respuesta

71

Debido a que usted Mezcla casperjs y entornos de páginas remotas. La función evaluate ejecutará el código dentro de la página remota env, por lo que la llamada console.log no generará nada.

Si se desea capturar remotasconsole.log llamadas, escuchar al evento remote.message:

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

Por cierto, documentation for events es más o menos exhaustiva, así como the one for evaluate.

+1

el '' 'es el setTimeout''' diferencia entre los ejemplos de OP. ¿Cómo cambia '' 'setTimeout''' esto? ambos se están ejecutando en el entorno remoto. –

+0

@nikkwong Dado que el OP no especificó a qué se refieren con * "funciona" * y * "no funciona" *, solo podemos adivinar. Pensaría que no se han dado cuenta de que están saliendo del flujo de control de CasperJS y, por lo tanto, se olvidó de esperar también en el flujo de control de 'casper'. Probablemente salieron demasiado temprano. Dudo que podamos llegar al fondo de esto a pesar de la actividad del PO. –

+0

FYI - los enlaces están rotos – evolutionxbox

20

@ La respuesta de NiKo es fundamental.

También sugeriría agregar lo siguiente, ya que si hay un error, puede que ni siquiera llegue lo suficientemente lejos como para imprimir un mensaje console.log() y en su lugar termine en silencio.

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

CasperJS incluye ClientUtils, que se puede utilizar desde la página remoto para conectarse fácilmente a la consola de la escritura de Casper:

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

Sobre la respuesta de @ odigity, esto hace casperjs mueren con una mayor familiarizados error/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

¡Fantástico! Solo estaba buscando algo como esto hoy también. ¿No debería el módulo de utilidad ser 'utils' aunque? – Qcom

+0

@Qcom, creo que 'utils' estaría bien, ya que es [_'sprintf' equivalent_] (http://casperjs.readthedocs.org/en/latest/modules/utils.html#format). Donde lo estaba usando, ya teníamos ['util'] (https://www.npmjs.com/package/util) disponible, así que lo utilicé :) – c24w

+0

Interesante, ¿estás usando casper junto con el nodo a través de SpookyJS? ¿o equivalente? Que yo sepa, casper no se integra con el ecosistema del módulo de nodo por defecto. – Qcom