2012-09-23 12 views
7

Ich versuche, zu URLs zu navigieren, die aus dem Skript selbst erstellt werden.Casperjs kann URLs nicht dynamisch öffnen?

Dieser Beispielcode funktioniert nicht so wie ich es erwartet hatte. Kann nicht herausfinden, warum :(

var casper = require('casper').create({ 
    viewportSize:{ 
     width:1024, height:768 
    }, 
    pageSettings:{ 
     userAgent:'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11' 
    }, 
    verbose:true 
}); 

casper.on('open', function (location) { 
    console.log(location + ' loaded'); 
}); 

casper.start('http://www.google.com', function() { 
    this.test.assertTitle('Google', 'Google homepage title is the one expected'); 
}); 

casper.mytest = ''; 

casper.then(function() { 
    casper.mytest = 'http://www.yahoo.com'; 
}); 

casper.thenOpen(casper.mytest, function() { 
    this.test.assertTitle('Yahoo', 'Yahoo homepage title is the one expected'); 
}); 

casper.run(function() { 
     casper.exit(); 
    } 
); 

Das Ergebnis ist, dass die zweite Seite nicht geladen:

http://www.google.com loaded 
PASS Google homepage title is the one expected 
loaded  
FAIL Yahoo homepage title is the one expected 
# type: assertTitle 
# subject: "" 
# expected: "Yahoo" 

Antwort

10

Ich denke, der Grund für Ihr Problem im Moment, dass, wenn Sie sich registrieren thenOpen Schritt für Yahoo die Variable casper.mytest ist leer. dieser Wert in den in diesem Moment Karte von Schritten des CasperJS bekommt, und es spielt keine Rolle, dass Sie die Quellvariable in dem Schritt vor ändern.

die Blog-Post Webscraping with CasperJS and PhantomJS hilfreich sein kann ein s ein Beispiel für das Abrufen von dynamisch erstellten URLs.

+1

Vielen Dank! In der Tat, wenn ich this.open() innerhalb von then() {} verwende, funktioniert es. Es ist jedoch sehr beunruhigend, da ich befürchte, dass es wahrscheinlich zu sehr hässlichen Code führen wird, wenn mein Projekt skaliert :( – johnjohn

+0

@johnjohn, vor einiger Zeit habe ich einen Patch (keine kleine Sache) von CasperJS gemacht, der es funktionierte Schritt-für-Schritt (Ad-hoc) -Weg. Sie könnten wahrscheinlich das gleiche für Ihre Bedürfnisse tun. Das Problem mit meiner Version ist, dass es vor einiger Zeit war, und jetzt veraltet ist, und ich nicht planen, zu portieren das zum neuesten CasperJS. – Stan