Comment puis-je attendre une connexion socket.io pour renvoyer des données à l'aide de casperJS?

Je gratte une page qui utilise socket.io pour remplir certaines options de balises sélectionnées. Comment puis-je attendre que le socket reçoive les données avant d'évaluer la page? J'utilise casperJS

Le code socket (chargé par le site cible):

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++; } }); 

Je vérifie que le script socket.io a été chargé:

 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)' ? }); 

Mais les balises d'option ne sont pas sur la page, vraisemblablement parce que j'évalue la page trop tôt

 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 }); }); }); }); 

Vous pourriez faire quelque chose comme ce qui suit, comme lud1977 l'explique, mais je ne l'aime pas. Casper's waitFor travaille par le vote, alors que c'est vraiment stupide en attendant qu'un événement se produise. Ce serait bien mieux si vous faites cela:

 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)); }) 

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

Je vous suggère de jeter un oeil à cette page: comment attendre la visibilité des éléments dans les phantomjs

En particulier la fonction waitfor. Dans la situation que vous avez décrite, j'utiliserais quelque chose comme ça pour vérifier si la page a été remplie de données du socket, ce qui signifie que la socket a fini de charger.

J'espère que cela aide.