2016-08-09 4 views
3

Ich versuche, mit Nightmarejs einfach folgen Skript zu machen. Es sollte in der nächsten Art und Weise arbeiten:Nightmarejs .click() auf jedes Element mit Verzögerung zwischen

  1. Gehe zu einem Benutzerprofil
  2. Klicken Sie auf die Schaltfläche zum Öffnen Liste von Anhängern des Benutzers
  3. Klicken Sie alle folgen Tasten mit Verzögerung zwischen jedem Klick
  4. Click Last mehr
  5. Wiederholen Schritt 3. und 4. paar mal

Was ich habe, so weit ist dies, und es funktioniert ohne Fehler, aber es klickt nur auf den ersten Follow-Taste und das ist Ende:

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

ich so eine Schleife Klick auf Folge Tasten versucht, aber es gibt mir $ Fehler ist nicht definiert

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

ich glaube, dass für jemanden, der in Nightmarejs erfahren ist, wird diese einfache Aufgabe, aber ich damit gerade erst begonnen und wurde jetzt mit ihm für 2 Tage zu kämpfen.

Ich würde wirklich jede Hilfe zu schätzen wissen.

Antwort

4

Sie erhalten $ is not defined, weil diese Syntax Teil von jQuery ist, wenn Sie NightmareJS Skript schreiben, verwendet es reines Javascript.

Sie jQuery-Bibliothek laden kann (vor bewerten Sie) dank .inject("js", "https://code.jquery.com/jquery-3.1.0.min.js")

Wir einen synchronen Schlaf müssen funktionieren, sonst NightmareJS kann die Funktion evaluate beenden, bevor es fertig ist. (Ich fand den Code für sleep auf diesem Thread: https://stackoverflow.com/a/17532524/6479780) Wenn Sie asynchronen Schlaf ausprobieren mögen, haben Sie setTimeout(callback, millis) hier zu verwenden ist, was ich tun würde, mit reinem javascript:

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

Ich sehe. Dies funktioniert, aber es klickt alle auf einmal, könnten Sie mit Verzögerung zwischen jedem bearbeiten? Und wenn ich gut verstanden habe, im Grunde können Sie jede pure JavaScript-Funktion innerhalb .evaluate hinzufügen? Vielen Dank! – Plavookac

+0

Der Code in evaluate wird in dem von nightmarejs geöffneten Fenster ausgeführt. Im Grunde ist es so, als ob Sie in Ihrem Browser eine neue Registerkarte öffnen, die Adresse der Website eingeben und den Inhalt der Funktion "evaluate" in die Konsole einfügen. Das ist, warum pure Javascript funktioniert – Omar

+0

Electron Browser friert beim Schlafen so ein – RetroCode

0

diese Version Versuchen:

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

Dies funktioniert nicht. – Coder

Verwandte Themen