我想在我的 node.js 脚本中使用 phantomjs。有一个phantomjs-node库.. 但不幸的是作者使用这个奇怪的咖啡脚本代码来解释他在做什么:
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 模块?
A:简短的回答:“没有人可以侍奉两个主人。”
更长的解释如下。
到目前为止,这样做在技术上非常具有挑战性。
每个 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();
});
});
});
});
不幸的是,这也不起作用..同样的结果!