2016-05-04 8 views
1

Я пытаюсь взять заголовки вопросов с домашней страницы Stackoverflow. Мой кошмар JS ниже.nightmarejs document.getElementsByClassName() return empty object

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

Это работает, когда я запускаю консоль Chrome.

Results Chrome Console

Однако в nightmareJS это мой выход.

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 $ 

Оцените, пожалуйста, почему мои объекты пусты. См. Изображение для скриншота консоли HTML и Chrome с результатами.

+0

Anonymous downvoter поможет объяснить, почему вы отказались? – thepiercingarrow

ответ

1

(Примечание: этот разговор порт из segmentio/nightmare#617.)

Я подозреваю, что части DOMElement являются несчетными, и как таковые не пересекая границы IPC. Другими словами, он не будет сериализоваться хорошо.

Фиксация довольно проста: вырвите значения, необходимые внутри .evaluate(). Скажем, вы хотите заголовок вопроса и ссылки:

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

Обратите внимание, что использование Array.from является преднамеренным: document.getElementsByClassName() возвращает массив-подобный объект, известный как HTMLCollection.