2013-07-08 14 views
7

twitterからいくつかの情報を取得しようとしていますCasperJSそして、私は無限のスクロールで立ち往生しています。問題は、ページをスクロールするためにjqueryを使用してもnothingsが機能するように見えることです。スクロールも、window(uiNearTheBottomのようなsmth)の正確なイベントの起動もどちらも役に立ちません。 興味深いことに、jsコンソールからFF & ChromeにJSコードを注入すると、これらの試みはすべて動作します。 は、ここではサンプルコードは次のとおりCasperJSはtwitterを無限にスクロールできません

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

又は

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

CasperJSがjQueryをクライアント側のページに挿入すると、Twitterの無限スクロールによって読み込まれたコンテンツがブロックされます。これはサイト固有の問題です。ソリューションについては私の答えをご覧ください。 – tfmontague

答えて

2

CasperJsはPhantomJSと議論以下の通り窓なしのオブジェクトに基づいてヘッドレスブラウザのために存在します。

あなたが使用することができ、Twitterでの議論にhere

+0

少なくとも、ページコンテキストには 'document'が存在します。そして、初めてのスクロールが働いています。しかし、ツイートは読み込まれません。 –

1

を確認することができます。

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

しかし、あなたは... jQueryのが含まれている場合、上記のコードは動作しません!

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

スクリプトインジェクションブロック積載量からTwitterの無限スクロール。 BoingBoing.netでは、CasperJSのscrollToBottom()はjQueryをブロックせずに動作します。それは実際にサイトに依存します。

ただし、コンテンツがロードされた後にjQueryを挿入できます。

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

casper.scrollToBottomは())あなたやcasper.scroll_to_bottomを(失敗した場合は、以下のいずれかがあなたを提供します:= {トップ

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

作業例:

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

これは、基礎となるPhantomJSスクロール使用here

+0

'document.body.scrollHeight'はCasperコンテキストにあり、' casper.evaluate'の内部にはありませんか? @ArtjomB。 –

+1

私は作業コードを追加しました。実際、私は現在、私がやっている掻き取りにそれを使用しています。それはPhantomJSで見られるように基礎となるコードを呼び出すことを伴います。 – iChux

+1

CasperJSのtwitter scrappingの作業コピーがhttps://gist.github.com/nwaomachux/35d1c424966fccd16ae1 – iChux

0

を見つけた私は、何が起こることは、私はページを入力している基本的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.') 
}); 

からこれを採用していますコンテキストを表示し、下にスクロールしてからコンテンツが消えるまで2秒待ってください広告。明らかに、私はcasper.scrollToBottom()や何かもっと洗練されたアプリケーションを繰り返し使うのが好きだったでしょうが、読み込み時間は私にこれを起こさせるものではありませんでした。

+0

にありますここではinifniteのスクロールの概念はありますか? 。あなたはループを繰り返しただけです。 –

関連する問題