Próbuję użyć Caspers by uzyskać listę linków ze strony, następnie otworzyć każdy z tych linków i dodać do obiektu tablicy konkretny typ danych z tych strony.Casperjs iteruje listę linków za pomocą casper.each
Problem, który mam, dotyczy pętli wykonywanej na każdym z elementów listy.
Najpierw otrzymuję listOfLinks
z oryginalnej strony. Ta część działa i używając długości mogę sprawdzić, czy ta lista jest wypełniona.
Jednakże, używając poniższej instrukcji pętli this.each
, żadna z instrukcji konsoli nigdy się nie wyświetla i wydaje się, że casperjs pomija ten blok.
Zastępując this.each
standardową pętlą, wykonanie przechodzi tylko przez pierwsze łącze, ponieważ instrukcja "Tworzenie nowej tablicy w obiekcie dla x.html" pojawia się raz, a następnie kod przestaje działać. Używanie IIFE nie zmienia tego.
Edit: w trybie debugowania gadatliwym dodaje się dzieje:
Creating new array object for https://example.com
[debug] [phantom] Navigation requested: url=about:blank, type=Other, willNavigate=true, isMainFrame=true
więc z jakiegoś powodu URL, który jest przekazywany do funkcji thenOpen zostanie zmieniony na puste ...
czuję się jak jest coś takiego w asynchronicznej naturze Casperjsa, którego tu nie rozumiem i byłbym wdzięczny za wskazanie przykładu.
casper.then(function() {
var date = Date.now();
console.log(date);
var object = {};
object[date] = {}; // new object for date
var listOfLinks = this.evaluate(function(){
console.log("getting links");
return document.getElementsByClassName('importantLink');
});
console.log(listOfLinks.length);
this.each(listOfLinks, function(self, link) {
var eachPageHref = link.href;
console.log("Creating new array in object for " + eachPageHref);
object[date][eachPageHref] = []; // array for page to store names
self.thenOpen(eachPageHref, function() {
var listOfItems = this.evaluate(function() {
var items = [];
// Perform DOM manipulation to get items
return items;
});
});
object[date][eachPageHref] = items;
});
console.log(JSON.stringify(object));
});
Dodany inna odpowiedź, że należy właściwie rozwiązać wszystkie problemy z skryptu. – Vaviloff