【问题标题】:How can I wait for a socket.io connection to return data using casperJS?如何等待 socket.io 连接使用 casperJS 返回数据?
【发布时间】:2014-01-05 18:47:41
【问题描述】:

我正在抓取一个使用 socket.io 来填充一些选择标签选项的页面。在评估页面之前如何等待套接字接收数据?我正在使用casperJS

套接字代码(由目标站点加载):

socket.on('list', function (data) {


$.each(data.match_names, function (id, name) {
    if (some condition) {
        /*nothing*/
    } else {
        if (typeof( varname ) == 'function') {
            $('#myselector').append('<option value="' + id + '">' + name + " " + get_tournament_name(id.substr(0, 4)) + '</option>');
        } else {
            $('#myselector').append('<option value="' + id + '">' + name + '</option>');
        }
        match_count++;
    }
});

我检查 socket.io 脚本是否已加载:

casper.waitForResource("socket.io.js", function() {
    this.echo('socket.io has been loaded.'); //is printed

//how can I check that data has arrived from 'socket.on('list', function (data)' ?
});

但是选项标签不在页面上,大概是因为我评估页面太早了

casper.then(function() {
    baseTargetUrl = this.evaluate(function() {
        return __utils__.getElementByXPath('//*[@id="wrapper"]/div[1]/a[2]')["href"];
    });
    console.log('logging: '+baseTargetUrl); // works

    casper.thenOpenAndEvaluate(baseTargetUrl ,function() { //baseTargetUrl is no longer undefined, it's a closure now

        $(function(){ // DOM is ready

            var myOptions = [] ;

            $('select#myselector option').each(function(){
                myOptions.push( $(this).text() + ' : '+$(this).val() ); //additional options have not yet been added

            });

        });
    });
});

【问题讨论】:

    标签: javascript casperjs


    【解决方案1】:

    我猜你可以按照 lud1977 的描述执行以下操作,尽管我不喜欢它。 Casper 的 waitFor 通过轮询来工作,而在等待事件发生时这真的很愚蠢。如果你这样做会更好:

    var list = null; // broader scope
    
    casper.on('socket.list', function() {
      // do stuff with <list> here
    });
    
    casper.waitForResource("socket.io.js", function() { 
      var socket = io.connect("http://wherever-the-server-is")
      socket.on('list', function(data){
        list = data;
        this.emit('socket.list');
      }.bind(this));
    })
    

    来源:http://docs.casperjs.org/en/latest/events-filters.html

    【讨论】:

    • 谢谢,但这些都不适合我。在您的第二个示例中,除非您在页面上下文中的 evaluate() 范围内,否则未定义套接字将不起作用。另外,你不能做 require("socket.io.js");
    • 请以我的代码为例,根据您的需要进行调整。你不能做 require(..) 的事实是没有问题的。只需加载 het Socket.io 客户端库。 window.io 将被定义,您可以调用 var socket = io.connect(....) 请注意:socket.io 0.9 使用与 socket.io 1.0 不同的设置方法。
    【解决方案2】:

    我建议你看看这个页面: how to wait for element visibility in phantomjs

    尤其是waitfor函数。在您描述的情况下,我会使用类似的方法来检查页面是否已填充来自套接字的数据,这意味着套接字已完成加载。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2021-01-07
      • 2021-10-06
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 2021-07-24
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多