可以phantomjs用Node.js的工作?(can phantomjs work with no

2019-08-18 15:54发布

我想在我的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();
      });
    });
  });
});

不幸的是,这不是工作要么..同样的结果!

Answer 1:

phantomjs节点不是一个官方支持NPM包phantomjs。 相反,它通过创建一个使用的WebSockets作为节点和幻象之间的IPC通道的web服务器实现节点和幻象之间的“nauseously聪明桥”。 我不是做这件事 :

因此,我们通过旋转起来ExpressJS的一个实例,在子进程打开幻影,并在一个特殊的网页,轮流socket.io消息进入警戒指向它()调用与PhantomJS沟通。 这些警报()的调用由幻影拾起和你去那里!

所以我也不会,如果phantomjs节点的工作,不工作惊讶,静静地失败,或壮观的失败。 我也不会期望比phantomjs节点的作者的其他任何人能够解决phantomjs节点。

回答你原来的问题是从phantomjs常见问题的答案:魅影号和节点有不可调和的分歧。 双方期望有过类似的事件循环,网络堆栈,以及JS执行基本的底层功能的完全控制,使他们不能在同一进程中开展合作。



Answer 2:

你也可以给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();
    });


Answer 3:

我现在对于新的维护者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。



Answer 4:

更改您的代码这一点,这将是工作:

 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();
       });
     });
   });
 });


Answer 5:

你可以只沟PhantomJS像我一样,因为它只是太多与这些包装都不尽如人意疼痛,并与去Zombie.js这是相当受欢迎。



Answer 6:

看来,这是工作..

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();
          });
        });
      });
    });


Answer 7:

我遇到了同样的问题,你这样做,显然,有一个已知的问题与phantomjs-node和的NodeJS的新版本。 好像它停止围绕节点0.9.3地方工作,根据问题的意见。 所以,直到已经解决,您可能已降级的NodeJS,或者尝试一个不同的模块,如节点幻影 ,或只是使用exec/spawn



文章来源: can phantomjs work with node.js?