4

我是 Nightmare/PhantomJS 的新手,正在努力获取给定页面上所有标签的简单清单。在从源代码构建 PhantomJS 并手动安装 NodeJS、Nightmare 等之后,我在 Ubuntu 14.04 上运行,其他功能似乎按我的预期工作。

这是我正在使用的代码:

var Nightmare = require('nightmare');
new Nightmare()
  .goto("http://www.google.com")
  .wait()
  .evaluate(function () 
   {
     var a = document.getElementsByTagName("*");
     return(a);
   }, 
   function(i) 
   {
     for (var index = 0; index < i.length; index++)
     if (i[index])
        console.log("Element " + index + ": " + i[index].nodeName);
    })
  .run(function(err, nightmare) 
  {
     if (err) 
        console.log(err);
  }); 

当我在“真实”浏览器中运行它时,我会得到页面上所有标签类型的列表(HTML、HEAD、BODY、...)。当我使用node GetTags.js运行它时,我只得到一行输出:

Element 0: HTML

我确定这是一个新手问题,但是我在这里做错了什么?

4

1 回答 1

3

PhantomJS 有两个上下文。提供对 DOM 的访问的页面上下文只能通过evaluate(). 因此,变量必须显式地传入和传出页面上下文。但是有一个限制(docs):

注意:函数的参数和返回值evaluate必须是简单的原始对象。经验法则:如果它可以通过 JSON 序列化,那就没问题了。

闭包、函数、DOM 节点等将不起作用

Nightmare 的evaluate()函数只是对同名 PhantomJS 函数的封装。这意味着您将需要使用页面上下文中的元素,并且只将表示传递给外部。例如:

.evaluate(function () 
{
    var a = document.getElementsByTagName("div");
    return a.length;
}, 
function(i) 
{
    console.log(i + " divs available");
})
于 2015-06-16T20:05:22.453 回答