(ナイトメア #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');
});
このアプローチには問題があります。実際には無限スクロールであるページに反対する場合、上記は決して終了しません。また、この.wait()
呼び出しを、スクロール要素の数が変化するのを待つことに置き換えて、待ち時間を短縮し、堅牢性を高めることもできます。それでも、始めるにはこれで十分です。
EDIT:あなたはセレクターについて尋ねました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');
});
このアプローチにはまだ問題があります。1 つは、クエリを満たすためにページに依存していることですwhile
。これは必ずしも保証されているわけではありません。