我是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,...)。当我使用节点GetTags.js 运行时,我只得到一行输出:
Element 0: HTML
我确定这是一个新手问题,但我在这里做错了什么?
答案 0 :(得分:3)
PhantomJS有两个上下文。提供对DOM的访问的页面上下文只能通过evaluate()
访问。因此,必须明确地将变量传入和传出页面上下文。但是有一个限制(docs):
注意:
evaluate
函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。闭包,函数,DOM节点等将不工作!
梦魇evaluate()
函数只是同名PhantomJS函数的包装器。这意味着您需要使用页面上下文中的元素,并仅将表示传递给外部。例如:
.evaluate(function ()
{
var a = document.getElementsByTagName("div");
return a.length;
},
function(i)
{
console.log(i + " divs available");
})