一尘不染

phantomjs可以与node.js一起使用吗?

node.js

我想在我的node.js脚本中使用phantomjs。有一个phantomjs-
node
库。.但是不幸的是,作者使用了这个奇怪的coffee脚本代码来解释他在做什么:

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编写上面代码的第一段代码(通过阅读coffee脚本文档
..这就是我所做的:

// 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执行)具有完全控制权(以同步方式)。

如果目的是直接在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();
      });
    });
  });
});

不幸的是,这也不起作用..相同的结果!


阅读 299

收藏
2020-07-07

共1个答案

一尘不染

phantomjs-
node并不是phantomjs官方支持的npm软件包。相反,它通过创建使用websocket充当节点和幻象之间的IPC通道的Web服务器,在节点和幻象之间实现了“巧妙的桥梁”。我没有弥补

因此,我们通过分解ExpressJS的实例,在子进程中打开Phantom并将其指向一个特殊的网页(将socket.io消息转换为alert()调用)来与PhantomJS进行通信。Phantom接听了那些alert()呼叫,然后您就可以开始了!

因此,如果phantomjs-node工作正常,不工作,无提示失败或出现异常失败,我不会感到惊讶。除了phantomjs-
node的作者之外,我也不会期望其他任何人能够对phantomjs-node进行故障排除。

原始问题的答案是phantomjs常见问题解答的答案:不。幻影和节点之间存在无法调和的差异。两者都希望完全控制基本的底层功能,例如事件循环,网络堆栈和JS执行,因此它们无法在同一过程中进行协作。

2020-07-07