我想在我的Node.js脚本使用phantomjs。 有一个phantomjs节点库..但不幸的是,作者用这种怪异的咖啡脚本代码来解释他在做什么:
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等效(通过读取咖啡脚本文件 ..这是我做的:
// 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执行。
如果目的是只是使用权PhantomJS从内Node.js的运行脚本,这样的“松散结合”可以通过启动一个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节点不是一个官方支持NPM包phantomjs。 相反,它通过创建一个使用的WebSockets作为节点和幻象之间的IPC通道的web服务器实现节点和幻象之间的“nauseously聪明桥”。 我不是做这件事 :
因此,我们通过旋转起来ExpressJS的一个实例,在子进程打开幻影,并在一个特殊的网页,轮流socket.io消息进入警戒指向它()调用与PhantomJS沟通。 这些警报()的调用由幻影拾起和你去那里!
所以我也不会,如果phantomjs节点的工作,不工作惊讶,静静地失败,或壮观的失败。 我也不会期望比phantomjs节点的作者的其他任何人能够解决phantomjs节点。
回答你原来的问题是从phantomjs常见问题的答案:魅影号和节点有不可调和的分歧。 双方期望有过类似的事件循环,网络堆栈,以及JS执行基本的底层功能的完全控制,使他们不能在同一进程中开展合作。
你也可以给phridge一试。 你的榜样会一直这样写的:
var phantom;
// spawn a new PhantomJS process
phridge.spawn()
.then(function (ph) {
phantom = ph;
return phantom.openPage("http://www.google.com");
})
.then(function (page) {
return page.run(function () {
// this function runs inside PhantomJS with this bound to a webpage instance
return this.title;
});
})
.then(function (title) {
console.log('Page title is ' + title);
// terminates the process cleanly
phantom.dispose();
});
我现在对于新的维护者phantom-node
包。 它不会再使用CoffeeScript的。 你可以这样做
var phantom = require('phantom');
phantom.create().then(function(ph) {
ph.createPage().then(function(page) {
page.open('https://stackoverflow.com/').then(function(status) {
console.log(status);
page.property('content').then(function(content) {
console.log(content);
page.close();
ph.exit();
});
});
});
});
新版本的速度要快得多,有弹性。 它也不会再使用WebSockets。
更改您的代码这一点,这将是工作:
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);
page.evaluate((function() {
return document.title;
}), function(result) {
console.log('Page title is ' + result);
ph.exit();
});
});
});
});
你可以只沟PhantomJS像我一样,因为它只是太多与这些包装都不尽如人意疼痛,并与去Zombie.js这是相当受欢迎。
看来,这是工作..
var phantom = require('phantom');
phantom.create().then(function(ph) {
ph.createPage().then(function(page) {
page.open('https://stackoverflow.com/').then(function(status) {
console.log(status);
page.property('content').then(function(content) {
console.log(content);
page.close();
ph.exit();
});
});
});
});
但我想产生一些外部脚本文件的HTML页面。 这是无法注入一个脚本文件。 我试着像下面。 回调不从线路返回page.injectJs('./jQuery.min.js',function() {
var phantom = require('phantom');
phantom.create().then(function(ph) {
ph.createPage().then(function(page) {
page.injectJs('./jQuery.min.js', function() {
page.property('content').then(function(content) {
console.log(content);
page.close();
ph.exit();
});
});
});
});
我遇到了同样的问题,你这样做,显然,有一个已知的问题与phantomjs-node
和的NodeJS的新版本。 好像它停止围绕节点0.9.3地方工作,根据问题的意见。 所以,直到已经解决,您可能已降级的NodeJS,或者尝试一个不同的模块,如节点幻影 ,或只是使用exec/spawn
。