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.

Результаты Chrome Console

Однако в 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,

Другие вопросы по тегам