nightmarejs document.getElementsByClassName()返回空对象

时间:2016-05-04 04:57:27

标签: javascript dom nightmare

我正试图从Stackoverflow主页中获取问题标题。 我的噩梦.JS代码如下。

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

然而,在噩梦中,这是我的输出。

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控制台的屏幕截图,请参阅图片

1 个答案:

答案 0 :(得分:2)

(注意:此对话是来自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