Я хотел бы использовать phantomjs в моем node.js script. есть библиотека phantomjs-node, но, к сожалению, автор использовал этот странный код кофе script, чтобы объяснить, что он делает:
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 (читая кофе script документацию.. это это то, что я сделал:
// 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 faq:
Q: Почему PhantomJS не написан как модуль node.js?
A: Короткий ответ: "Никто не может служить двум мастерам".
Более длинное объяснение выглядит следующим образом.
В настоящее время технически очень сложно это сделать.
Каждый модуль node.js по существу является "подчиненным" в ядре node.js, т.е. "хозяин". В своем текущем состоянии PhantomJS (и включенный в него WebKit) должен иметь полный контроль (в синхронном режиме) все: цикл событий, сетевой стек и выполнение JavaScript.
Если намерение заключается в использовании PhantomJS прямо из scriptработающий в пределах node.js, такое "свободное связывание" может быть достигнуто посредством запуск процесса PhantomJS и взаимодействие с ним.
mmm.. может ли это иметь к этому какое-то отношение? но тогда вся эта библиотека не имеет смысла!
обновление 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();
});
});
});
});
к сожалению, что не работает либо.. тот же результат!