2012-09-23 9 views
7

Próbuję przejść do adresów URL, które są tworzone ze skryptu.Casperjs nie może dynamicznie otwierać adresów URL?

Ten przykładowy kod nie działa tak, jak oczekiwałam (miałem). Nie mogę zrozumieć, dlaczego :(

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(); 
    } 
); 

Powoduje to, że druga strona nie ładuje:

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" 

Odpowiedz

10

myślę, powodem problemu jest to, że w momencie, gdy zarejestrujesz thenOpen krok dla Yahoo zmienna casper.mytest jest pusty. wartość ta dostaje się odwzorować CasperJS za kroków w tej chwili, i to nie ma znaczenia, że ​​zmiany zmiennej źródłowej w etapie poprzednim.

Blog po Webscraping with CasperJS and PhantomJS mogą być pomocne za s przykład pobierania dynamicznie skonstruowanych adresów URL.

+1

Dziękujemy! Rzeczywiście, jeśli użyję this.open() wewnątrz then() {}, to działa. Jest to bardzo niepokojące, ponieważ obawiam się, że prawdopodobnie doprowadzi to do bardzo brzydkiego kodu, ponieważ mój projekt się skaluje :( – johnjohn

+0

@johnjohn, jakiś czas temu zrobiłem łatkę (nie jest to mała rzecz) CasperJS, która sprawiła, że ​​działa Problem może być taki sam jak w przypadku Twoich potrzeb. Problem z moją wersją jest taki, że był jakiś czas temu, a teraz jest już nieaktualny i nie planuję portu to do najnowszego CasperJS. – Stan

Powiązane problemy