2016-08-09 1 views
3

J'essaie de faire un script de suivi simple avec Nightmarejs. Il devrait fonctionner suivant façon:Nightmarejs .click() sur chaque élément avec un retard entre

  1. Aller à un certain profil de l'utilisateur
  2. Cliquez sur le bouton pour ouvrir la liste des disciples de cet utilisateur
  3. Cliquez tous suivez boutons avec délai entre chaque clic
  4. Cliquez charge plus
  5. Répétez étape 3. et 4. quelques fois

Ce que j'est jusqu'à présent cela, et cela fonctionne sans erreur, mais il clique seulement sur le premier bouton de suivi et qui est fin:

var Nightmare = require('nightmare'); 
var nightmare = Nightmare({ show: true }) 

nightmare 
.goto('http://example.com/') 
.click('.buttonOpenModal') 
.wait(4000) 
.click('.buttonFollow') 
    .end() 
    .then(function (result) { 
    console.log(result) 
    }) 
    .catch(function (error) { 
    console.error('Search failed:', error); 
    }); 

J'ai essayé de cliquer boucle sur les boutons de suivi comme celui-ci, mais il me donne l'erreur $ n'est pas définie

var Nightmare = require('nightmare'); 
var nightmare = Nightmare({ show: true }) 

nightmare 
.goto('http://example.com/') 
.click('.buttonOpenModal') 
.wait(4000) 
.evaluate(function(){ 
    $('.buttonFollow').each(function() { 
     $(this).click(); 
    }); 
    }) 
    .end() 
    .then(function (result) { 
    console.log(result) 
    }) 
    .catch(function (error) { 
    console.error('Search failed:', error); 
    }); 

Je crois que pour quelqu'un qui est expérimenté dans Nightmarejs ce sera une tâche simple, mais je viens de commencer avec elle et a été aux prises avec elle pendant 2 jours maintenant.

J'apprécierais vraiment toute aide.

Répondre

4

Vous obtenez $ is not defined car cette syntaxe fait partie de jQuery, lorsque vous écrivez un script NightmareJS, il utilise du javascript pur.

Vous pouvez charger la bibliothèque jquery (avant evaluateing) grâce à la fonction .inject("js", "https://code.jquery.com/jquery-3.1.0.min.js")

Nous avons besoin d'un sommeil synchrone, sinon NightmareJS peut mettre fin à la fonction evaluate avant qu'elle ne se termine. (J'ai trouvé le code pour sleep sur ce fil: https://stackoverflow.com/a/17532524/6479780) Si vous voulez essayer le sommeil asynchrone, vous devez utiliser setTimeout(callback, millis) Voici ce que je ferais, en utilisant javascript pur:

var Nightmare = require('nightmare'); 
var nightmare = Nightmare({ show: true }) 

nightmare 
.goto('http://example.com/') 
.click('.buttonOpenModal') 
.wait(4000) 
.evaluate(function(){ 
    function sleep(ms) { 
    var start = new Date().getTime(), expire = start + ms; 
    while (new Date().getTime() < expire) { } 
    return; 
    } 

    var list = document.querySelectorAll('.buttonFollow'); 
    list.forEach(function(elt){ 
     elt.click(); 
     //We need synchronous sleep here 
     sleep(2000); //Wait 2 seconds 
    }); 
    }) 
.end() 
.then(function (result) { 
    console.log(result) 
}) 
.catch(function (error) { 
    console.error('Search failed:', error); 
}); 
+0

Je vois. Cela fonctionne mais il clique tout à la fois, pourriez-vous éditer avec le retard entre chacun? Et si j'ai bien compris, vous pouvez simplement ajouter une fonction javascript pure à l'intérieur de .evaluate? Je vous remercie! – Plavookac

+0

Le code en évaluation sera exécuté dans la fenêtre ouverte par nightmarejs. Donc, fondamentalement, c'est comme si vous ouvrez un nouvel onglet sur votre navigateur, vous tapez l'adresse du site Web et vous collez le contenu de la fonction 'evaluate' dans la console. C'est pourquoi pur javascript fonctionne – Omar

+0

Le navigateur Electron se fige quand il dort comme ça – RetroCode

0

Essayez cette version:

var Nightmare = require('nightmare'); 
var nightmare = Nightmare({ show: true }); 

nightmare 
    .goto('http://example.com/') 
    .click('.buttonOpenModal') 
    .wait('div.Buttons') 
    .evaluate(function() { 
    var interval = setInterval(function() { 
     var btn = document.querySelectorAll('div.Buttons'); 
     if (undefined == btn || 0 == btn.length) { 
     clearInterval(interval); 
     } 
     else { 
     btn[0].click(); 
     } 
    }, 5000); 
    }) 
    .end() 
    .then(function (result) { 
    console.log(result) 
    }) 
    .catch(function (error) { 
    console.error('Search failed:', error); 
    }); 
+0

Cela ne marche pas. – Coder