如何在 Phantom.js 中监视 WebSocket 通信

How to monitor WebSocket communication in Phantom.js?

本文关键字:监视 WebSocket 通信 js Phantom      更新时间:2023-09-26

Phantom.js文档展示了如何监控HTTP通信: http://phantomjs.org/network-monitoring.html

但是,它不适用于WebSockets。如何在 Phantom.js 中监视 WebSocket 通信?

PhantomJS 1.x 不支持 WebSockets1,因此您无法监视它们。如果页面对 WebSocket 使用一些回退,则可以使用 page.onResourceRequestedpage.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 页面适用于 v1.9.6 及更高版本,但不适用于 v1.9.0。

如果页面对 WebSocket 使用一些回退,则 page.onResourceRequest和page.onResourceReceived可用于 记录消息的元数据。PhantomJS 不会公开 以任何方式发送的实际数据。

Slimer JS帮助解决了这个问题。更精简的JS将允许您捕获响应正文。这在 phantom 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) {
})