梦魇循环点击事件

时间:2017-03-04 00:39:03

标签: javascript web-scraping phantomjs nightmare

我正在学习梦魇。尝试访问网站,登录,然后迭代地单击按钮以显示更多数据,直到该按钮不再存在。我做了一个虚拟帐户来说明。

我第一次成功登录并点击了按钮,但是当我尝试再次点击它时,它会记录一个错误,它无法找到'.more-checkins'元素。

最终,我希望这段代码能够存在于循环中,而不是告诉代码点击......等待......然后再次单击。帮助设计也将非常感激。

const Nightmare = require('nightmare')
const untappdURL = 'https://untappd.com/user/beerFan2017'


Nightmare({
    show: true,
    openDevTools: true,
    waitTimeout: 90000000 // increase the default timeout to test things
})
    .goto(untappdURL)
    .click('.more_checkins')
    .type('#username', 'beerFan2017')
    .type('#password', 'Testing2017')
    .click('input[type="submit"]')
    .wait('.stats')
    .click('.more_checkins')
    .evaluate(function() {
        return console.log('Begin waiting');
    })
    .wait(5000)
    .evaluate(function() {
        return console.log('Waiting end');
    })
    .click('more_checkins')
    .then(result => console.log(result))
    .catch(error => console.error(error))

1 个答案:

答案 0 :(得分:2)

由两部分组成的答案:一,在nightmare-examples上阅读asynchronous operations and loops。这将有助于您获得有关promises迭代的一些背景知识。

二,梦魇回购中有一个类似的问题 - #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');
});

希望这足以让你开始。