2016-05-07 10 views
1

私はここで間違っていますか?私はセレクタがなくなるまでページを下にスクロールしたい。Javascript - Nightmare.JS無限スクロールアクション

Nightmare.action('scrollPage', function (done) { 
      this.evaluate_now(function() { 
      var hitRockBottom = false; 
      while (!hitRockBottom) { 
       // console.log("1"); 
      // Scroll the page (not sure if this is the best way to do so...) 
      this.scrollTo(100000, 0); 

      // Check if we've hit the bottom 
      hitRockBottom = this.evaluate(function() { 
       // console.log("0"); 
       return this.exists('selector') === null; 
      }); } 
      }, done) 
     }) 

私が使用しています:

.goto("link") 
.scrollPage() 

答えて

2

を(。Nightmare #625から私のオリジナルの答えを移植)

これは、あなたの質問に答えるために非常にナイーブ方法です:

var Nightmare = require('nightmare'); 
var vo = require('vo'); 
var nightmare = Nightmare({ 
    show: true 
}); 

var run = function *() { 
    yield nightmare.goto('http://someInfiniteScrollPage.tld'); 

    var previousHeight, currentHeight=0; 
    while(previousHeight !== currentHeight) { 
    previousHeight = currentHeight; 
    var currentHeight = yield nightmare.evaluate(function() { 
     return document.body.scrollHeight; 
    }); 
    yield nightmare.scrollTo(currentHeight, 0) 
     .wait(3000); 
    } 
    yield nightmare.end(); 
}; 

vo(run)(function(err) { 
    console.dir(err); 
    console.log('done'); 
}); 

このアプローチには問題があります:あなたが行っているときgのページに対してactually is an infinite scroll、上記は決して終了しません。また、.wait()コールは、スクロール要素のカウントが潜在的に待ち時間を短縮し、堅牢性を高めるために変化するのを待つことに置き換えることができる。それでも、これはあなたを始めるのに十分なはずです。


EDIT:あなたがあなたの代わりに増加し、高さを見ているのセレクタを使用するwhile句を入れ替えることができ、セレクタについて尋ねました。腰からは、何かのように:1のために、あなたは必ずしも保証されないwhileクエリを、満たすためにページに頼っている:

var Nightmare = require('nightmare'); 
var vo = require('vo'); 
var nightmare = Nightmare({ 
    show: true 
}); 

var run = function *() { 
    yield nightmare.goto('http://someInfiniteScrollPage.tld'); 

    while(document.querySelectorAll('.someClass').length > 0) { 
    var currentHeight = yield nightmare.evaluate(function() { 
     return document.body.scrollHeight; 
    }); 
    yield nightmare.scrollTo(currentHeight, 0) 
     .wait(3000); 
    } 
    yield nightmare.end(); 
}; 

vo(run)(function(err) { 
    console.dir(err); 
    console.log('done'); 
}); 

このアプローチにはまだ問題があります。

+0

私は何かが完全に欠けているに違いないように感じます - 'document'は実際にページの' document'オブジェクトを参照していますか?私はそれがそのようには機能しなかったという印象を受けました。私のコードで 'document'を参照しようとすると、"ドキュメントが定義されていません "というエラーが出ます。 ? – rinogo

+0

また、これらの例のwhileループは非常に「きつく」ループしているように見えます(意図した3秒待機なし)。あれは正しいですか? NightmareJSへのすべてのコールは非同期です。 – rinogo

+0

'while'ループに関して - 私はそれがジェネレータを使うことと関係があると思いますか?私は発電機newbです。それをもっと調べます。 – rinogo

関連する問題