7

CasperJSを使用して Twitter から情報を取得しようとしています。そして、私は無限スクロールで立ち往生しています。問題は、jquery を使用してページを下にスクロールしても何もないように見えることです。スクロールも、正確なイベントのトリガーもwindow(uiNearTheBottomのようなもの)、役に立たないようです。興味深いことに、これらの試みはすべて、FF および Chrome の js コンソールを介して JS コードを挿入するときに機能します。コード例は次のとおりです。

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

また

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

4 に答える 4

1

Twitter では以下を使用できます。

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();
    });
});
于 2014-05-04T19:51:36.567 に答える
0

以前の回答からこれを採用しました

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()たり、より洗練されたものを使用したかったのですが、ロード時間のためにこれを実現できませんでした.

于 2015-08-20T23:51:06.440 に答える