2017-03-04 2 views
1

J'apprends le cauchemar. Essayer de visiter un site Web, connectez-vous, puis cliquez sur un bouton itérativement pour faire apparaître plus de données jusqu'à ce que le bouton n'existe plus. J'ai fait un compte fictif pour l'illustration.Boucle de cauchemar grâce aux événements Click

J'ai réussi à me connecter et à cliquer sur le bouton la première fois, mais quand j'essaye de le faire cliquer à nouveau, il enregistre une erreur qu'il ne peut pas trouver l'élément '.more-checkins'. En fin de compte, je voudrais que ce code vive dans une boucle plutôt que de dire au code de cliquer ... attendre ... et cliquer à nouveau. Aide à la conception de ce serait également grandement apprécié.

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

Répondre

0

réponse en deux parties: un, allez lire asynchronous operations and loops sur nightmare-examples. Cela vous aidera à comprendre l'itération avec des promesses. Deux, il existe un problème similaire dans le repo Nightmare - #625 - qui consiste à continuer à charger plus lorsque vous atteignez la fin de la barre de défilement. Un exemple d'implémentation (qui est très naïf, soyez prudent):

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

Espérons que vous donne assez pour commencer.