(Портирование мой первоначальный ответ от 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
запрос, который не обязательно гарантируется.
Я чувствую, что я, должно быть, совсем чего-то не хватает. Действительно ли «документ» относится к объекту 'document' страницы? У меня создалось впечатление, что это не сработало. И когда я пытаюсь ссылаться на 'document' в моем коде, я получаю ошибку« document not defined ». ? – rinogo
Кроме того, похоже, что циклы 'while' в этих циклах примеров очень« плотно »(без ожидаемого трехсекундного ожидания). Это верно? Все вызовы NightmareJS асинхронны, не так ли? – rinogo
Что касается циклов 'while' - я предполагаю, что это связано с использованием генераторов? Я генератор newb; будет изучать его больше. – rinogo