PhantomJS有控制台吗?

14

我在github上找到了这个:https://github.com/gr2m/phantomjs-console

但是它有点疯狂,需要在一个文件中写入命令,只能写一行,然后读取并删除该文件,输出结果在终端中。

我想要一个像...

$ phantomjs --console
phantom> console.log(typeof $)
[Object Function]
phantom> console.log("happy days")
happy days
phantom> 

有类似这样的东西吗?

编辑:开始理解为什么他们用如此疯狂的方式...

来自PhantomJS-Node: https://github.com/sgentle/phantomjs-node

真的吗,它是如何工作的?

我将用一个问题回答这个问题。如果一个进程不支持共享内存、套接字、FIFO或标准输入,你该如何与它通信呢?

好吧,PhantomJS支持一件事情,那就是打开网页。实际上,它非常擅长打开网页。所以我们通过启动一个ExpressJS实例,在子进程中打开Phantom,并将其指向一个特殊的网页,将socket.io消息转换为alert()调用来与PhantomJS通信。这些alert()调用被Phantom捕获,于是你就完成了!

通信本身是通过James Halliday的fantastic dnode库进行的,幸运的是,当与browserify结合使用时,它足够好用,可以直接在PhantomJS的pidgin Javascript环境中运行。

如果您想要hack Phantom,请随意!您可以使用cake test或npm test运行测试,并使用cake build重新构建coffeescript/browserified代码。您可能需要npm install -g coffeescript才能使cake正常工作。

2个回答

14
自从1.5版本近一年前推出交互模式(REPL)以来,您只需启动PhantomJS而无需任何参数,它将立即开始REPL模式

现在你提到了它,实际上在命令行帮助文档中已经清楚地记录了...“如果没有任何参数,PhantomJS将启动交互模式(REPL)。”我不明白为什么我以前找不到这个信息。 - Billy Moon
2
看起来REPL中的一个错误阻止了页面的打开...所以现在只能回到我的hackish解决方案... - Billy Moon
REPL无法打开页面...? - CMCDragonkai

5

好的,最终我编写了一个包装脚本来替代我最初提供的控制台脚本:https://github.com/gr2m/phantomjs-console

这种做法有些混乱,但是实际上正好符合我的要求。事实证明,PhantomJS有处理标准输入/输出的计划,但目前尚未实现。当它被实现后,这种疯狂的互动方法将变得过时,而一个新的简单脚本将能够作为控制台。

#!/usr/bin/env coffee

sys = require "sys"
fs = require "fs"

# stdin = process.openStdin()
# stdin.addListener "data", (d)-> console.log "you entered: [" + d.toString().substring(0, d.length-1) + "]"

readline = require "readline"

spawn = require("child_process").spawn
phantom = spawn("phantomjs", ["phantom_console.coffee", "http://local/"])

rl = readline.createInterface process.stdin, process.stdout
rl.setPrompt 'phantom> '
rl.prompt()

rl.on 'line', (line)->
  if line == "exit"
    phantom.kill()
    rl.close()
  else
    fs.writeFile ".command.js", line
  # rl.prompt()

rl.on 'close', ->
  phantom.kill()
  process.exit(0)

phantom.stdout.on "data", (data) ->
  console.log data+''
  rl.prompt()

phantom.stderr.on "data", (data) ->
  console.log "\nstderr: " + data
  rl.prompt()

phantom.on "exit", (code) ->
  console.log "child process exited with code " + code

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接