我想在我的node.js腳本中使用phantomjs。有一個phantomjs-node庫..但不幸的是,作者用這種怪異的咖啡腳本代碼來解釋他在做什麼:phantomjs可以使用node.js嗎?
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,它會看起來像this:
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的第一個片段的當量(通過讀取咖啡腳本documentation ..這是我做過什麼:
// 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();
});
不幸的是它不工作!如果我在shell中運行
node phantomTest.js
,沒有任何反應..沒有回報和進程不會停止..任何想法?
更新:
我剛纔讀這在phantomjs faq:
問:爲什麼不PhantomJS寫爲Node.js的模塊?
答:答案很簡單:「一個人不能事奉兩個主。」
更長的解釋如下。
截至目前,這在技術上非常具有挑戰性。
每個Node.js的模塊本質上是「從屬」到的Node.js, 即,「主」的核心。在目前的狀態下,PhantomJS(及其包含的 WebKit)需要完全控制(在同步問題中)所有事件:事件循環,網絡堆棧和JavaScript執行。
如果意圖只是使用在Node.js中運行的腳本 來使用PhantomJS,那麼可以通過啓動PhantomJS進程並與其交互來實現這樣的「鬆散綁定」。
嗯..可這有什麼關係呢?但那整個圖書館都沒有意義!
更新2:
我發現這個代碼在做同樣的事情的web:
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();
});
});
});
});
可惜就是不工作或者..同樣的結果!
返回調用一些「愚蠢」,因爲你不知道它是如何工作和/或你不能讓你的情況是工作很粗魯。 –
另外,還有比其他Node.js網橋更受推薦的https://github.com/sheebz/phantom-proxy。人們一直在使用Ruby,PHP和Node.js橋接PhantomJS,並取得了不同的成功。 –
對於我強烈的措辭表示歉意,我會從這個問題中提出來。我還會看看'phantom-proxy' ..在這一天結束時,我的目標是讓事情有效,它是不要貶低別人的努力。 – abbood