2016-05-07 2 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 использовать селектор вместо того, чтобы смотреть на увеличение высоты. От бедра, что-то вроде:

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

Этот подход все еще есть проблемы: для одного, вы полагаетесь на странице, чтобы удовлетворить while запрос, который не обязательно гарантируется.

+0

Я чувствую, что я, должно быть, совсем чего-то не хватает. Действительно ли «документ» относится к объекту 'document' страницы? У меня создалось впечатление, что это не сработало. И когда я пытаюсь ссылаться на 'document' в моем коде, я получаю ошибку« document not defined ». ? – rinogo

+0

Кроме того, похоже, что циклы 'while' в этих циклах примеров очень« плотно »(без ожидаемого трехсекундного ожидания). Это верно? Все вызовы NightmareJS асинхронны, не так ли? – rinogo

+0

Что касается циклов 'while' - я предполагаю, что это связано с использованием генераторов? Я генератор newb; будет изучать его больше. – rinogo

Смежные вопросы