我有一个打开websocket连接(socket.io)到node.js服务器的页面。
出于测试目的,我想使用无头浏览器打开页面,使用CasperJs(我也尝试过使用相同结果的纯PhantomJ)。
要点:
使用Chrome打开socket.io连接始终有效。
使用CasperJs打开socket.io连接始终有效(至少在客户端和服务器上执行相应的回调)
使用Chrome的消息交换(socket.emit)始终有效
使用CasperJs的消息交换(socket.emit)有时有效。
当我将socket.io配置为仅使用轮询而不是websocket时,我得到相同的行为。我知道"有时"并不是很准确,但我还没有找到一个"模式"但是当它发生时。
您是否使用无头浏览器成功打开socket.io/websockets页面?你有什么提示可能是什么原因吗?
更多细节:
我的客户执行
var socket = io.connect('http://localhost:3000');
之后在服务器上调用连接方法(它打印传输类型和套接字ID以进行调试):
io.on('connection', function (socket) {
console.log('Client connect ('+ socket.client.conn.transport.constructor.name +'): ' + socket.id);
...
}
输出是预期的(socket.io首先使用XHR,然后升级到websocket):
Client connect (XHR): d-moyZ_D6Z6eG7SNAAAA
同样在客户端执行connect回调:
socket.on('connect', function () {
console.log("Client successfully connected to data server. Transport type: " + socket.io.engine.transport.constructor.name);
...
}
客户端控制台上的输出符合预期:
Client successfully connected to data server. Transport type: XHR
如果我使用普通浏览器,我可以毫无问题地交换消息。如果我使用我的casper脚本,则消息交换有时有效。在大多数情况下,当我调用socket.emit时没有任何反应。 casper脚本非常基本。我觉得它可能是一个计时问题,所以我创建了一个等待执行连接的javascript资源,没有变化:
casper = require('casper').create({
verbose: true,
logLevel: "debug"
});
casper.start('page.html', function() {
this.echo(this.getTitle());
});
casper.waitForResource("dataConnection.js", function() {
this.echo('socket.io has been loaded.');
this.wait(14000, function() {
this.echo("I've waited for some seconds.");
});
this.capture('casper.png');
});
casper.on('remote.message', function(message) {
console.log(message);
});
casper.run();
客户端/服务器上的断开连接回调也按预期执行。您可以看到对websocket的升级工作:
Client disconnect (WebSocket): d-moyZ_D6Z6eG7SNAAAA connectionCount: 0
谢谢!