Phantom.js文档显示了如何监控HTTP通信:http://phantomjs.org/network-monitoring.html
但是,它不适用于WebSockets。如何监控Phantom.js中的WebSocket通信?
答案 0 :(得分:9)
PhantomJS 1.x不支持WebSockets 1 ,因此您无法监控它们。如果页面使用WebSockets的某些回退,则可以使用page.onResourceRequested
和page.onResourceReceived
来记录消息的元数据。 PhantomJS不会以任何方式公开发送的实际数据。
WebSockets在PhantomJS 2中正常工作。由于不需要回退,无法观察这些事件的流量。上面提到的事件处理程序不会显示任何内容。查看消息的唯一方法是尽早代理WebSocket
对象:
page.onInitialized = function(){
page.evaluate(function(){
(function(w){
var oldWS = w.WebSocket;
w.WebSocket = function(uri){
this.ws = new oldWS(uri);
...
};
w.WebSocket.prototype.send = function(msg){
w.callPhantom({type: "ws", sent: "msg"});
this.ws.send(msg);
};
...
})(window);
});
};
page.onCallback = function(data){
console.log(JSON.stringify(data, undefined, 4));
};
1 我的测试实际上表明websocket echo page适用于v1.9.6及更高版本,但不适用于v1.9.0。
答案 1 :(得分:1)
如果页面使用WebSockets的一些后备,那么 page.onResourceRequested和page.onResourceReceived可用于 记录消息的元数据。 PhantomJS不公开 以任何方式发送的实际数据。
Slimer JS帮助解决了这个问题。 Slimer JS将让你捕获响应体。使用幻像JS 1.x是不可能的,并且此功能已从最新的2.x中删除。
https://github.com/ariya/phantomjs/issues/10158
使用slimerjs,您可以捕获XHR请求的内容,但不能为websocket请求执行此操作。 因此,我们将在页面初始化时明确禁用网页的websockets(page.onInitialized),以便网页将使用回退,即XHR,然后您可以捕获内容。
page.captureContent = [ /application\/javascript/ ];
page.onInitialized = function() {
page.evaluate(function() {
(function(w) {
window.WebSocket = undefined; // we are explicitly disabling websockets for the page. so that the website will be using the fallback
})(window);
});
};
page.open(url, function(status) {
})