2013-07-08 7 views
7

Sto cercando di ottenere alcune informazioni da Twitter utilizzando CasperJS. E sono bloccato con scroll infiniti. Il fatto è che anche usando jquery per scorrere la pagina verso il basso, niente sembra funzionare. Né lo scorrimento, né l'attivazione dell'evento esatto su window (smth come uiNearTheBottom) non sembra essere d'aiuto. Interessante: tutti questi tentativi funzionano quando si inserisce il codice JS tramite js console in FF & Chrome. Ecco il codice di esempio:CasperJS non può attivare Twitter scroll infinito

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

o

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

Quando CasperJS inietta jQuery nella pagina lato client, blocca il contenuto caricato dallo scorrimento infinito di Twitter. Questo è un problema specifico del sito. Si prega di vedere la mia risposta qui sotto per una soluzione. – tfmontague

risposta

2

CasperJs si basa su PhantomJS e come sotto discussione non esistono oggetto finestra per il browser senza testa.

È possibile controllare la discussione here

+0

In almeno, 'document' esiste nel contesto della pagina. E la prima volta che funziona lo scroll. Ma i tweet non si caricano. –

1

Su Twitter è possibile utilizzare:

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

Ma se si include jQuery ..., il codice di cui sopra non funzionerà! blocchi iniezione

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

Lo script infinita di scorrimento di Twitter dal caricamento del contenuto. Su BoingBoing.net, CasperJS scrollToBottom() funziona con jQuery senza bloccare. Dipende davvero dal sito.

Tuttavia, è possibile iniettare jQuery dopo che il contenuto è stato caricato.

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

Se casper.scrollToBottom() voi o casper.scroll_to_bottom() non riesce, poi quello di seguito vi servirà:

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

Un esempio di lavoro:

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

Esso utilizza le PhantomJS sottostanti scroll pensa here

+0

Sei sicuro che 'document.body.scrollHeight' è nel contesto di Casper e non all'interno di un' casper.evaluate'? –

+1

@ArtjomB. Ho aggiunto un codice funzionante.In effetti, attualmente lo sto usando in uno scraping che sto facendo. Si tratta di chiamare il codice sottostante come trovato in PhantomJS. – iChux

+1

Ora c'è una copia funzionante di twitter scraping con CasperJS su https://gist.github.com/nwaomachux/35d1c424966fccd16ae1 – iChux

0

Ho adottato questo da 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.') 
}); 

Essenzialmente ciò che accade è che entro la pagina contesto, scorrere fino in fondo, quindi attendere 2 secondi per il contenuto anno Domini. Ovviamente mi sarebbe piaciuto usare le applicazioni ripetute di casper.scrollToBottom() o qualcosa di più sofisticato, ma il tempo di caricamento non mi permetteva di farlo accadere.

+0

dove si trova il concetto di scrolling intuitivo qui? . hai appena iterato su un loop. –