2016-05-31 23 views
0

zu bewerten Ich versuche NightmareJS v2 und Vo mit Node.JS zu verwenden, um ein paar Suchbegriffe durchzusuchen und Daten von ihnen zu sammeln.NightmareJS nicht in der Lage, mit vo

const nightmare = require('nightmare'), 
    vo = require('vo'), 
    nbot = nightmare({ title: 'Bot', 
         show: true }); 

const searchTerms = ['spacex', 'tesla', 'elon musk', 'hyperloop']; // EXAMPLE SEARCH TERMS 

vo(run)(function(err) { 
    if (err) throw err 
}); 

function * run() { 
    yield nbot.goto('http://google.com'); 

    yield * forEach(searchTerms, gen); 

    yield nbot.end() 
    .then(function(result) { 
    console.log(result) // STUFF SHOULD BE LOGGED HERE 
    }); 
} 

function * gen(item) { 
    yield nbot.wait('input[title="Search"]') 
      .click('input[title="Search"]') 
      .type('input[title="Search"]', item) 
      .click('input[name="btnK"]') 
      .wait(100) 
      .screenshot(item + '.png') 
      .insert('input[title="Search"]', '') 
      .evaluate(function() { 
       return 'foobar' // STUFF RETURNED HERE 
      }) 
} 

function * forEach (arr, fn) { // NEEDED BECAUSE FOREACH DOESN'T WORK IN GENERATORS 
    let i; 
    for (i = 0; i < arr.length; i++) { 
    yield * fn(arr[i]); 
    } 
} 

Nach NightmareJS der docs, wenn Sie etwas in evaluate kehrt dann wird es ausspucken, wenn Sie then verwenden: Mein Code kann unten gesehen werden. Wenn ich das versuche, werde ich undefiniert. Ich nehme an, es ist etwas mit den Generatoren, aber ich bin neu für sie, also kann ich es nicht sagen. Hilfe wird geschätzt.

Antwort

2

Das Beispiel ist Schließen, aber es sieht so aus, als ob Sie Generator mit Promise-Syntax mischen und anpassen. Die .evaluate() Methode verhält sich wie beschrieben, aber wenn Sie vo (oder co) verwenden, wird für Sie erledigt und verwaltet, wobei der Wert von .then() zurück auf die linke Seite der yield zurückgegeben wird Ausdruck, wenn einer definiert ist. Auch, was es wert ist, geben Ihre Generatoren keine Werte zurück, und als solche erhalten Sie (korrekt) undefined.

This geht in ein bisschen mehr Tiefe auf Iteratoren, Generatoren, Versprechen, und vo/co. Sie können auch einen Blick auf nightmare-examples Dokument auf vo werfen.

Schließlich Ihr Beispiel modifizierte Ergebnisse von gen zurückzukehren, durch forEach bis zu run:

const nightmare = require('nightmare'), 
    vo = require('vo'), 
    nbot = nightmare({ 
    title: 'Bot', 
    show: true 
    }); 

const searchTerms = ['spacex', 'tesla', 'elon musk', 'hyperloop']; // EXAMPLE SEARCH TERMS 

vo(run)(function(err) { 
    if (err) throw err 
}); 

function* run() { 
    yield nbot.goto('http://google.com'); 

    var results = yield * forEach(searchTerms, gen); 
    console.log(results); 
    yield nbot.end(); 
} 

function* gen(item) { 
    var value = yield nbot.wait('input[title="Search"]') 
    .click('input[title="Search"]') 
    .type('input[title="Search"]', item) 
    .click('input[name="btnK"]') 
    .wait(100) 
    .screenshot(item + '.png') 
    .insert('input[title="Search"]', '') 
    .evaluate(function() { 
     return 'foobar' // STUFF RETURNED HERE 
    }); 

    return value; 
} 

function* forEach(arr, fn) { // NEEDED BECAUSE FOREACH DOESN'T WORK IN GENERATORS 
    let i; 
    var results = []; 
    for (i = 0; i < arr.length; i++) { 
    results.push(yield * fn(arr[i])); 
    } 
    return results; 
} 
+0

Thank you! Aber ich habe das Problem gestern gelöst, nachdem ich eine Stunde damit herumgespielt habe. Ich werde Ihre Antwort als akzeptiert markieren, um anderen mit einem solchen Problem in der Zukunft zu helfen. –

+1

Ehrfürchtig. Freut mich, dass es funktioniert hat. :) – Ross

0

gutes Beispiel! Das mitgelieferte Beispiel funktionierte in meinem Fall standardmäßig nicht (IP aus Deutschland).

Hier ist eine kleine Korrektur für eine allgemeine Suche:

const nightmare = require('nightmare'), 
    vo = require('vo'), 
    nbot = nightmare({ 
    title: 'Bot', 
    show: true 
    }); 

const searchTerms = ['spacex', 'tesla', 'elon musk', 'hyperloop']; // EXAMPLE SEARCH TERMS 

vo(run)(function(err) { 
    if (err) throw err 
}); 

function* run() { 
    yield nbot.goto('http://google.com'); 

    var results = yield * forEach(searchTerms, gen); 
    console.log(results); 
    yield nbot.end(); 
} 

function* gen(item) { 
    var inputTitle 
    var value = yield nbot 
    .evaluate(() => { 
     return document.getElementById("lst-ib").title 
    }) 
    .then((lang) => { 
     inputTitle = 'input[title="' + lang + '"]' 
     return true 
    }); 
    yield nbot 
    .wait(inputTitle) 
    .click(inputTitle) 
    .type(inputTitle, item) 
    .click('input[name="btnK"]') 
    .wait(100) 
    .screenshot(item + '.png') 
    .insert(inputTitle, '') 
    .evaluate(function() { 
     return 'foobar' // STUFF RETURNED HERE 
    }); 

    return value; 
} 

function* forEach(arr, fn) { // NEEDED BECAUSE FOREACH DOESN'T WORK IN GENERATORS 
    let i; 
    var results = []; 
    for (i = 0; i < arr.length; i++) { 
    results.push(yield * fn(arr[i])); 
    } 
    return results; 
}