我想在我的node.js脚本中使用phantomjs。有一个phantomjs- node库。.但是不幸的是,作者使用了这个奇怪的coffee脚本代码来解释他在做什么:
phantom = require 'phantom' phantom.create (ph) -> ph.createPage (page) -> page.open "http://www.google.com", (status) -> console.log "opened google? ", status page.evaluate (-> document.title), (result) -> console.log 'Page title is ' + result ph.exit()
现在,如果我直接将phantomjs与javascript一起使用,它将看起来像这样:
var page = require('webpage').create(); page.open(url, function (status) { var title = page.evaluate(function () { return document.title; }); console.log('Page title is ' + title); });
所以基本上我想用普通的javascript编写上面代码的第一段代码(通过阅读coffee脚本文档 ..这就是我所做的:
// file name: phantomTest.js var phantom = require('phantom'); phantom.create(function(ph) { ph.createPage(function(page) { page.open('http://www.google.com', function(status) { console.log('opened google?', status); var title = page.evaluate(function() { return document.title; }); console.log('page title is ' + title); }); }); ph.exit(); });
不幸的是,它不起作用!如果我跑步
node phantomTest.js
在外壳上,什么也没有发生..什么也没有返回,并且过程没有停止..任何想法?
更新:
我只是在phantomjs 常见问题中阅读了这篇文章:
问:为什么PhantomJS没有写为Node.js模块? 答:简短的答案:“没有人可以担任两个主人。” 更长的解释如下。 到目前为止,这样做在技术上非常具有挑战性。 每个Node.js模块本质上都是Node.js核心(即“主”)的“从属”。在当前状态下,PhantomJS(及其随附的WebKit)需要对所有内容(事件循环,网络堆栈和JavaScript执行)具有完全控制权(以同步方式)。 如果目的是直接在Node.js中运行的脚本中使用PhantomJS,则可以通过启动PhantomJS进程并与其进行交互来实现这种“松散绑定”。
问:为什么PhantomJS没有写为Node.js模块?
答:简短的答案:“没有人可以担任两个主人。”
更长的解释如下。
到目前为止,这样做在技术上非常具有挑战性。
每个Node.js模块本质上都是Node.js核心(即“主”)的“从属”。在当前状态下,PhantomJS(及其随附的WebKit)需要对所有内容(事件循环,网络堆栈和JavaScript执行)具有完全控制权(以同步方式)。
如果目的是直接在Node.js中运行的脚本中使用PhantomJS,则可以通过启动PhantomJS进程并与其进行交互来实现这种“松散绑定”。
嗯..这可能与它有关吗?但是整个图书馆就没有意义了!
更新2:
我在网上找到了执行相同操作的代码:
var phantom = require('phantom'); phantom.create(function(ph) { return ph.createPage(function(page) { return page.open("http://www.google.com", function(status) { console.log("opened google? ", status); return page.evaluate((function() { return document.title; }), function(result) { console.log('Page title is ' + result); return ph.exit(); }); }); }); });
不幸的是,这也不起作用..相同的结果!
phantomjs- node并不是phantomjs官方支持的npm软件包。相反,它通过创建使用websocket充当节点和幻象之间的IPC通道的Web服务器,在节点和幻象之间实现了“巧妙的桥梁”。我没有弥补:
因此,我们通过分解ExpressJS的实例,在子进程中打开Phantom并将其指向一个特殊的网页(将socket.io消息转换为alert()调用)来与PhantomJS进行通信。Phantom接听了那些alert()呼叫,然后您就可以开始了!
因此,如果phantomjs-node工作正常,不工作,无提示失败或出现异常失败,我不会感到惊讶。除了phantomjs- node的作者之外,我也不会期望其他任何人能够对phantomjs-node进行故障排除。
原始问题的答案是phantomjs常见问题解答的答案:不。幻影和节点之间存在无法调和的差异。两者都希望完全控制基本的底层功能,例如事件循环,网络堆栈和JS执行,因此它们无法在同一过程中进行协作。