2017-08-11 5 views
0

Geben Sie das folgende Beispiel, warum ist categoryIdnull?CasperJS: evaluate() gibt Nullwert zurück

var scripts = this.evaluate(function() { 
    var raScripts = "A lengthy script"; 

    return raScripts; 
}); 

var categoryId = this.evaluate(function() { 
    var text = 'more text'; 
    var lengthyScript = scripts + ' ' + text; 

    return lengthyScript; 
}); 

this.echo('Status: ' + categoryId); 
// categoryId is null 
+0

Die Variable 'Skripte' sind außerhalb des Seitenkontexts definiert, werden aber innerhalb verwendet. –

+0

Und wie kann ich die 'raScripts' Variable außerhalb der' this.evaluate' Funktion verwenden? –

+0

Sie haben das bereits getan, indem Sie es vom Callback 'evaluate' zurückgeben. Der Wert von 'raScripts' ist gleich dem Wert von' scripts' (wenn der Wert ein primitives Objekt ohne zyklische Referenzen ist). Sie müssen nur den Wert von 'script' zurück in den Seitenkontext für die nächste" Berechnung "innerhalb des Seitenkontextes übergeben. –

Antwort

0

Ich denke, das liegt daran, dass Ihre scripts Variable nicht in der Browser-Umgebung definiert ist (es nur in Ihrem Casper Umgebung definiert ist). In der Tat, wenn Sie evaluate verwenden, ist der Kontext das DOM, nicht die Casper-Instanz.

Dies wird null zurück:

var casper = require('casper').create(); 
var tag = 'h1'; // This is our global variable... 

casper.start('http://example.com/'); 

casper.waitForSelector('body', function() { 
    this.echo(this.evaluate(function() { 
    return document.querySelector(tag).textContent; // Oops! 
    })); 
}); 

casper.run(); 

Aber wenn wir unsere Variable im Zusammenhang mit evaluate injizieren, bekommen wir das erwartete Ergebnis (die "Beispiel Domain" ist):

var casper = require('casper').create(); 

casper.start('http://example.com/'); 

casper.waitForSelector('body', function() { 
    this.echo(this.evaluate(function (tag) { 
    return document.querySelector(tag).textContent; 
    }, 'h1')); 
}); 

casper.run(); 
+0

Vielen Dank für Ihren Kommentar, aber ich kann mich wirklich nicht um Ihr Beispiel kümmern. Die 'scripts'-Variable gibt" Ein langes Skript "zurück. Mein Problem ist mit der Variable 'categoryId'. Es gibt 'null' anstelle von 'Ein längeres Skript mehr Text' zurück, obwohl es auf der gleichen Logik wie die 'scripts'-Variable basiert. –

Verwandte Themen