PhantomJS 有控制台吗?

Posted

技术标签:

【中文标题】PhantomJS 有控制台吗?【英文标题】:Is there a console for PhantomJS? 【发布时间】:2013-02-23 11:31:28 【问题描述】:

我在 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 的实例与 PhantomJS 进行通信, 在子进程中打开 Phantom,并将其指向一个特殊的网页 这会将 socket.io 消息转换为 alert() 调用。那些alert() 电话 被 Phantom 捡起来,然后就可以了!

交流本身是通过 James Halliday 的精彩 dnode 库,幸运的是,当与 browserify 直接运行 PhantomJS 的 pidgin javascript 环境。

如果您想破解 phantom,请执行!您可以运行测试 使用 cake test 或 npm test,并重建 coffeescript/browserified 带有蛋糕构建的代码。您可能需要npm install -g coffeescript 让蛋糕发挥作用。

【问题讨论】:

【参考方案1】:

自从version 1.5 差不多一年前就有了一种交互模式 (REPL)。你只需要不带任何参数启动 PhantomJS,它会立即从REPL mode 开始。

【讨论】:

现在你提到了它,它实际上在命令行的帮助中清楚地记录了......Without any argument, PhantomJS will launch in interactive mode (REPL).我不明白为什么我之前找不到那个信息。 而且似乎 REPL 中的一个错误阻止了页面打开......所以现在回到我的 hackish 解决方案...... REPL 无法打开页面...?【参考方案2】:

好吧,我最终为我最初链接到的控制台脚本编写了一个包装脚本: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

【讨论】:

以上是关于PhantomJS 有控制台吗?的主要内容,如果未能解决你的问题,请参考以下文章

从PhP执行时,PhantomJS无法找到GLIBC

使用phantomjs进行Odoo测试 - page.evaluate eval结果:false

从 php 启动 phantomjs 服务器并等待它的响应

为什么这个PhantomJS进程导致“目录 不存在。“错误?

如何从codeception和phantomjs测试中获取当前url?

phantomjs/selenium 和 jQuery 自动填充表单的方式有区别吗?