2016-05-04 13 views
1

Ich versuche, die Frage Titel von Stackoverflow Homepage zu greifen. Mein AlbtraumJS-Code unten.nightmarejs document.getElementsByClassName() leeres Objekt zurückgeben

var Nightmare = require('nightmare'); 
var startingLink = "http://stackoverflow.com" 

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

nightmare 
    .goto(startingLink) 
    .evaluate(function() { 
     return document.getElementsByClassName('question-hyperlink') 
    }) 
    .end() 
    .then(function(content) { 
     console.log(content); 
    }) 

Es funktioniert, wenn ich in der Chrome-Konsole laufen.

Results Chrome Console

jedoch in nightmareJS ist meine Ausgabe.

ming_o01 (master) nightmare1 $ DEBUG=nightmare node stackoverflow.js 
    '48': {}, 
    '49': {}, 
    '50': {}, 
    '51': {}, 
    '52': {}, 
    '53': {}, 
    '54': {}, 
    '55': {}, 
    '56': {}, 
    '57': {}, 
    '58': {}, 
    '59': {}, 
    '60': {}, 
    '61': {}, 
    '62': {}, 
    '63': {}, 
    '64': {}, 
    '65': {}, 
    '66': {}, 
    '67': {}, 
    '68': {}, 
    '69': {}, 
    '70': {}, 
    '71': {}, 
    '72': {}, 
    '73': {}, 
    '74': {}, 
    '75': {}, 
    '76': {}, 
    '77': {}, 
    '78': {}, 
    '79': {}, 
    '80': {}, 
    '81': {}, 
    '82': {}, 
    '83': {}, 
    '84': {}, 
    '85': {}, 
    '86': {}, 
    '87': {}, 
    '88': {}, 
    '89': {}, 
    '90': {}, 
    '91': {}, 
    '92': {}, 
    '93': {}, 
    '94': {}, 
    '95': {} } 
ming_o01 (master) nightmare1 $ 

Ich schätze, warum meine Objekte leer sind. Siehe Bild für Screenshot der HTML- und Chrome-Konsole mit Ergebnissen.

+0

Anonymous Downvoter Pflege zu erklären, warum Sie downvoted ?? – thepiercingarrow

Antwort

1

(Anmerkung: dieses Gespräch ist ein Port von segmentio/nightmare#617.)

Ich vermute, dass DOMElement die Teile sind nicht-zählbare, und als solche nicht die IPC Grenze überqueren. Mit anderen Worten, es wird nicht gut serialisieren.

Es zu beheben ist ziemlich einfach: Zupfen Sie die gewünschten Werte in .evaluate(). Sagen Sie bitte die Frage Titel und Link wollte:

var Nightmare = require('nightmare'); 
var startingLink = "http://stackoverflow.com" 

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

nightmare 
    .goto(startingLink) 
    .evaluate(function() { 
    var elements = Array.from(document.getElementsByClassName('question-hyperlink')); 
    return elements.map(function(element) { 
     return { 
     href: element.href, 
     title: element.innerText 
     } 
    }); 
    }) 
    .end() 
    .then(function(content) { 
    console.log(content); 
    }) 

Beachten Sie, dass die Verwendung von Array.from ist gewollt: document.getElementsByClassName() ein Array-artiges Objekt als HTMLCollection bekannt gibt.

Verwandte Themen