2012-08-08 1 views
30

Warum, wenn ich console.log in evaluate verwenden, funktioniert es:console.log nicht in CasperJS funktioniert‘auswerten mit setTimeout

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

Aber das funktioniert nicht:

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

Verwandte: [Output clientseitige Konsole mit casper/PhantomJS] (http://stackoverflow.com/a/10783675/1816580) –

Antwort

71

Weil Sie mischen Casperjs und Remote-Seitenumgebungen. Die evaluate Funktion wird Code innerhalb der Remote-Seite env ausführen, so dass der console.log Aufruf nichts ausgeben wird.

Wenn Sie Fernconsole.log Anrufe fangen wollen, hören Sie die remote.message Veranstaltung:

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

Btw, ist documentation for events ziemlich erschöpfend sowie the one for evaluate.

+1

der '' 'setTimeout''' ist die Unterschied zwischen den Beispielen von OP. Wie ändert '' '' Timeout''' das? Sie werden beide in der entfernten Umgebung ausgeführt. –

+0

@nikkwong Da das OP nicht spezifiziert, was sie mit * "es funktioniert" * und * "funktioniert nicht" * meint, können wir nur raten. Ich würde denken, dass sie nicht bemerkt haben, dass sie aus dem Kontrollfluss von CasperJS ausbrechen und deshalb vergessen haben, auch im "Casper" Kontrollfluss zu warten. Sie sind wahrscheinlich zu früh ausgetreten. Ich bezweifle, dass wir trotz der OP-Aktivitäten dem auf den Grund gehen können. –

+0

FYI - Links sind gebrochen – evolutionxbox

20

@ NiKos Antwort ist kritisch.

Ich würde auch vorschlagen, das folgende hinzuzufügen, da, wenn es einen Fehler gibt, Sie es vielleicht nicht weit genug machen, um eine console.log() msg ​​auszudrucken, und am Ende mit Schweigen enden.

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

CasperJS umfasst ClientUtils, die von der entfernten Seite verwendet werden, können leicht an der Konsole des casper Skript zu protokollieren:

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

Aufbauend auf die Antwort von @ odigity, das macht casperjs mit mehr sterben vertraut Fehler/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

Fantastisch! Ich habe heute auch so etwas gesucht. Sollte das Utility-Modul nicht "Utils" sein? – Qcom

+0

@Qcom, ich denke, "utils" wäre in Ordnung, da es [_ 'printf' äquivalent_] (http://casperjs.readthedocs.org/en/latest/modules/utils.html#format) ist. Wo ich es benutzt habe, hatten wir bereits ['util '] (https://www.npmjs.com/package/util) zur Verfügung, also habe ich das gerade verwendet :) – c24w

+0

Interessant, verwenden Sie Casper in Verbindung mit Knoten über SpookyJS oder gleichwertig? Soweit ich weiß, ist casper standardmäßig nicht in das Node-Modul-Ökosystem integriert. – Qcom