Headless Browserify JavaScript 使用 Phantom.js 进行测试

Headless Browserify JavaScript Testing with Phantom.js

我正在尝试找到执行以下步骤的方法。

我很想获得浏览器收到的 console.logs,但在终端内。这不仅可以节省我的时间(从创建 HTML 文件、运行 服务器、打开浏览器),还可以进行很酷的事情,例如部署前的自动测试。

我正在尝试制作一个名为 headless-test.jsphantomjs 脚本,该脚本将使用 system.args[1] 传递参数,并且 fs.read 可以获得任何 javascript 你传递给它。

var content = fs.read(system.args[1])
page.content = '<html><body><script type="text/javascript">'+content+'</script></body></html>'

这将允许我做这样的事情:

phantomjs ./headless-test.js ./bundle.js

我遇到了这个错误 SyntaxError: Multiline comment was not closed properly 所以确保你丑化你的 bundle.js.

如果我能让下面的演示正常工作,所有这些都将是惊人的并且有效。最小可行产品:

var system = require("system")
var webPage = require('webpage')
var page = require('webpage').create()
page.content = '<html><body><script type="text/javascript">console.log("hello world")</script></body></html>';

page.onConsoleMessage = function(msg, lineNum, sourceId) {
  console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
};

page.evaluate(function(){

})

phantom.exit();

这里的预期结果是:

$ phantomjs ./headless-test.js
hello world

但是我没有从 phantom 得到 stdout

如果您向 page.content 分配某些内容,它会立即被评估,但之后您会从页面上下文注册到 console.log()。您只是错过了页面脚本元素中的 console.log()

page.content 赋值移动到 page.onConsoleMessage 函数之后。

var system = require("system")
var webPage = require('webpage')
var page = require('webpage').create()

page.onConsoleMessage = function(msg, lineNum, sourceId) {
  console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
}

var fs = require("fs")
var content = fs.read(system.args[1])
page.content = '<html><body><script type="text/javascript">'+content+'</script></body></html>'

phantom.exit();

我为此制作了一个节点工具:https://github.com/mantoni/phantomic

如果您还想使用 Mocha 作为测试框架,请尝试 Mochify (https://github.com/mantoni/mochify.js)。它使用 phantomicbrout 将控制台输出正确地输入终端。