如何在PhantomJS中获取QUnit测试HTML文件的控制台输出
如何在PhantomJS中获取QUnit测试HTML的控制台输出?
我明白你的问题——在浏览器里运行QUnit测试页面时,能在控制台看到JUnit格式的XML输出,但用PhantomJS调用这个页面时,没法从你的PhantomJS脚本里拿到这个输出。下面给你两个可靠的解决方案:
方案一:把测试结果暴露为页面全局变量(推荐)
这种方法最直接,不需要依赖控制台拦截,而是把需要的XML数据存到页面的全局变量里,让PhantomJS直接读取。
修改你的HTML文件
在QUnit.jUnitDone回调里,把data.xml存到window全局对象上:
QUnit.jUnitDone(function(data) { var console = window.console; if (console) { console.log(data.xml); } // 添加这行,将测试结果存入全局变量 window.testResultsXml = data.xml; });
修改你的PhantomJS脚本
在page.evaluate里直接读取这个全局变量:
var system = require('system'); var fs = require('fs'); var page = require('webpage').create(); if (system.args.length === 1) { console.log('Pass the path/to/testfile.js as argument to run the test.'); phantom.exit(); } else { var url = "file:///C:/Users/Admin/Desktop/js/index.html"; console.log("Opening " + url); page.open(url, function (status) { console.log("Status: " + status); if (status === "success") { setTimeout(function () { var path = 'results.xml'; // 从页面全局变量获取测试结果XML var output = page.evaluate(function () { return window.testResultsXml || ''; }); if (output) { fs.write(path, output, 'w'); console.log("Wrote JUnit style output of QUnit tests into " + path); } else { console.log("Warning: No test results were found."); } console.log("Tests finished. Exiting."); phantom.exit(); }, 3000); } else { console.log("Failure opening " + url + ". Exiting."); phantom.exit(); } }); }
方案二:拦截页面的控制台输出
如果你更倾向于通过控制台输出获取数据,可以给PhantomJS的页面添加onConsoleMessage监听,收集所有页面的控制台日志,然后提取你需要的XML内容:
修改你的PhantomJS脚本
var system = require('system'); var fs = require('fs'); var page = require('webpage').create(); var testXmlOutput = ''; // 监听页面的控制台输出 page.onConsoleMessage = function(msg) { console.log('Page console: ' + msg); // 判断是否是JUnit的XML输出(可以根据内容特征调整判断逻辑) if (msg.startsWith('<?xml version="1.0"')) { testXmlOutput = msg; } }; if (system.args.length === 1) { console.log('Pass the path/to/testfile.js as argument to run the test.'); phantom.exit(); } else { var url = "file:///C:/Users/Admin/Desktop/js/index.html"; console.log("Opening " + url); page.open(url, function (status) { console.log("Status: " + status); if (status === "success") { setTimeout(function () { var path = 'results.xml'; if (testXmlOutput) { fs.write(path, testXmlOutput, 'w'); console.log("Wrote JUnit style output of QUnit tests into " + path); } else { console.log("Warning: No test results were captured from console."); } console.log("Tests finished. Exiting."); phantom.exit(); }, 3000); } else { console.log("Failure opening " + url + ". Exiting."); phantom.exit(); } }); }
为什么原来的方法不行?
page.evaluate是在页面的沙箱环境中运行的,它无法直接访问页面的控制台输出历史——这个沙箱和PhantomJS的主脚本环境是隔离的。所以你需要通过全局变量传递数据,或者利用PhantomJS提供的事件监听机制来捕获页面的控制台输出。
内容的提问来源于stack exchange,提问作者Jaydeep Bobade
相关产品推荐
相关产品推荐

