nightmarejs document.getElementsByClassName() возвращает пустой объект
Я пытаюсь получить заголовки вопросов с домашней страницы Stackru. Мой кошмарный код JS ниже.
var Nightmare = require('nightmare');
var startingLink = "http://stackru.com"
var nightmare = Nightmare({show:true});
nightmare
.goto(startingLink)
.evaluate(function() {
return document.getElementsByClassName('question-hyperlink')
})
.end()
.then(function(content) {
console.log(content);
})
Это работает, когда я работаю в консоли Chrome.
Однако в NightmareJS это мой вывод.
ming_o01 (master) nightmare1 $ DEBUG=nightmare node stackru.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 с результатами.
1 ответ
(Примечание: этот разговор является портом из сегмента / кошмара № 617.)
Я подозреваю, что части DOMElement не перечисляются и как таковые не пересекают границу IPC. Другими словами, это не собирается сериализовать хорошо.
Исправить это довольно просто: вытащите нужные значения из .evaluate()
, Скажем, вы хотели название вопроса и ссылку:
var Nightmare = require('nightmare');
var startingLink = "http://stackru.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
,