1

ここで何が間違っていますか?セレクターがなくなるまでページをスクロールダウンしたい。

    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()
4

1 に答える 1

2

(ナイトメア #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。これは必ずしも保証されているわけではありません。

于 2016-05-24T15:30:47.600 に答える