2013-07-08 6 views
7

Ich versuche, einige Informationen von Twitter mit CasperJS zu bekommen. Und ich bin mit unendlicher Scroll festgefahren. Die Sache ist, dass selbst mit jQuery, um die Seite nach unten zu scrollen nichts zu tun scheint. Weder das Scrollen, noch das Auslösen des genauen Ereignisses auf window (ähnlich wie uiNearTheBottom) scheint nicht zu helfen. Interessante Sache - all diese Versuche funktionieren, wenn JS-Code über die js-Konsole in FF & Chrome injiziert wird. Hier ist der Beispielcode:CasperJS kann nicht twitter endlos scrollen

casper.thenEvaluate(function(){ 
    $(window).trigger('uiNearTheBottom'); 
}); 

oder

casper.thenEvaluate(function(){ 
    document.body.scrollTop = document.body.scrollHeight; 
}); 
+0

Wenn CasperJS jQuery in die clientseitige Seite injiziert, blockiert es Inhalte, die durch das unendliche Scrollen von Twitter geladen werden. Dies ist ein standortspezifisches Problem. Bitte sehen Sie meine Antwort unten für eine Lösung. – tfmontague

Antwort

2

CasperJs auf PhantomJS basiert und nach unten Diskussion kein Fensterobjekt gibt es für den Headless Browser.

können Sie überprüfen die Diskussion here

+0

Zumindest existiert 'Dokument' im Seitenkontext. Und beim ersten Mal funktioniert scrollen. Aber Tweets werden nicht geladen. –

1

Auf Twitter Sie verwenden können:

casper.scrollToBottom(); 
casper.wait(1000, function() { 
    casper.capture("loadedContent.png"); 
}); 

Aber wenn Sie jQuery umfassen ..., der obige Code wird nicht funktionieren!

var casper = require('casper').create({ 
    clientScripts: [ 
     'jquery-1.11.0.min.js' 
    ] 
}); 

Das Skript Injektion blockiert Twitter unendliche Rolle vom Laden des Inhalts. Auf BoingBoing.net arbeitet CasperJS scrollToBottom() mit jQuery ohne zu blockieren. Es hängt wirklich von der Seite ab.

Sie können jedoch jQuery injizieren, nachdem der Inhalt geladen wurde.

casper.scrollToBottom(); 
casper.wait(1000, function() { 
    casper.capture("loadedContent.png"); 

    // Inject client-side jQuery library 
    casper.options.clientScripts.push("jquery.js"); 

    // And use like so... 
    var height = casper.evaluate(function() { 
     return $(document).height(); 
    }); 
}); 
4

Wenn casper.scrollToBottom() Sie oder casper.scroll_to_bottom fehlschlägt(), dann unter dem werden Sie dienen:

this.page.scrollPosition = {top: this.page.scrollPosition ["top"] + document.body.scrollHeight, links: 0};

Ein Arbeitsbeispiel:

casper.start(url, function() { 
this.wait(10000, function() { 
    this.page.scrollPosition = { top: this.page.scrollPosition["top"] + document.body.scrollHeight, left: 0 }; 
    if (this.visible("div.load-more")) { 
     this.echo("I am here"); 
    } 
})}); 

Es die zugrunde liegenden PhantomJS verwendet blättern here

+0

Sind Sie sicher, dass 'document.body.scrollHeight' im Casper Kontext ist und nicht innerhalb einer' casper.evaluate'? –

+1

@ArtjomB. Ich habe einen Arbeitscode hinzugefügt.Tatsächlich benutze ich es gerade in einem Scraping, das ich mache. Dazu muss der zugrunde liegende Code wie in PhantomJS aufgerufen werden. – iChux

+1

Es gibt jetzt eine Arbeitskopie von Twitter-Verschrottung mit CasperJS unter https://gist.github.com/nwaomachux/35d1c424966fccd16ae1 – iChux

0

fand ich angenommen habe dies aus a previous answer

var iterations = 5; //amount of pages to go through 
var timeToWait = 2000; //time to wait in milliseconds 

var last; 
var list = []; 

for (i = 0; i <= iterations; i++) { 
    list.push(i); 
} 

//evaluate this in the browser context and pass the timer back to casperjs 
casper.thenEvaluate(function(iters, waitTime) { 
    window.x = 0; 
    var intervalID = setInterval(function() { 
     console.log("Using setInternal " + window.x); 
     window.scrollTo(0, document.body.scrollHeight); 

     if (++window.x === iters) { 
      window.clearInterval(intervalID); 
     } 
    }, waitTime); 
}, iterations, timeToWait); 

casper.each(list, function(self, i) { 

    self.wait(timeToWait, function() { 
     last = i; 
     this.echo('Using this.wait ' + i); 
    }); 

}); 

casper.waitFor(function() { 
    return (last === list[list.length - 1] && iterations === this.getGlobal('x')); 
}, function() { 
    this.echo('All done.') 
}); 

Wesentlichen, was passiert ist, ich die Seite eingeben Kontext, scrollen Sie nach unten und warten Sie 2 Sekunden, bis der Inhalt lo ist Anzeige. Offensichtlich hätte ich gerne wiederholte Anwendungen von casper.scrollToBottom() oder etwas anspruchsvoller verwendet, aber die Ladezeit erlaubte es mir nicht, dies zu erreichen.

+0

wo ist das Konzept der inifnite Scrollen hier? . Sie haben gerade über eine Schleife iteriert. –