2016-10-10 1 views
0

J'ai été en mesure de faire défiler jusqu'à la fin de ma page Web afin de charger tout le contenu dynamique. Mais après cela, je voudrais évaluer la page afin d'obtenir des données. Mon problème est si je cours quelque chose de différent d'un simpleCasperJS évaluer ne pas exécuter après avoir fait défiler vers le bas

casper.echo("something"); 

Mon code casse et je ne reçois pas les données notées. Ceci est mon code:

var casper = require('casper').create(); 
casper.start("http://mypageWithDynamicContentOnScroll.com"); 
var linksPrendas = []; 
casper.waitForSelector('#idOfDivContainingDynamicContent',function(){ 
    scrollNow(); 
}); 
var currentHeight; 
var page = 1; 
function scrollNow(){ 
    casper.scrollToBottom(); 
    casper.waitForSelector("#page"+page+"Height", function() { 
     casper.echo('scrolling...'); 
     page++; 
     scrollNow(); 
    }, 
    function _onTimeout(){ 

    }); 
} 

var data = ''; 
casper.then(function(){ 
    casper.echo('e'); 
    //data = __utils__.findOne('div#someId').textContent; 
    casper.echo('f'); 
    //var links = this.evaluate(function() { 
    // casper.echo("Evaluate "); 
    // var elements = __utils__.findAll('a'); 
    // return elements. map (function (e) { 
    //  return e.getAttribute('href'); 
    // }); 
    //}); 
}); 

casper.run(function(){ 

    // var data = casper.evaluate(function() { 
    //   var elements = __utils__.findAll('a.productListLink'); 
    //   return elements.map(function(e) { 
    //    return e.getAttribute('href'); 
    //   }); 
    //  casper.echo("Evaluate "); 
    //  return [1,2,3]; 
    // }); 
    casper.echo("Then"); 
    casper.echo(elements); 

    casper.echo("DONE").exit(); 

}); 

Vous pouvez voir une partie de mon code commenté que j'ai essayé beaucoup d'options différentes, sans succès. J'ai également essayé de placer l'évaluation ou le findAll dans le rappel _onTimeout. Je casse le code et "DONE" n'est jamais imprimé ou je ne peux jamais exécuter le code à l'intérieur d'évaluer ou n'importe quoi d'autre.

Le défilement fonctionne bien, et sans le défilement, je peux arriver à évaluer la page et obtenir le contenu voulu.

Alors, comment puis-je faire ce travail? Évaluez la page après le défilement?

Merci

EDIT: Je ai aussi testé le passage d'une fonction de rappel à scrollNow() pour poursuivre l'exécution après scrollNow() est appelée. Le rappel est appelé, mais encore une fois, pas de chance avec évaluer de findAll ou toute autre fonction pour obtenir les données voulues.

Répondre

1

L'objet casper est seulement disponible à l'extérieur de casper.evaluate et __utils__ est seulement disponible à l'intérieur de casper.evaluate. Appeler casper.echo(...) entraînera un TypeError et arrêtera l'exécution.

Si vous voulez imprimer quelque chose du contexte de la page (à l'intérieur de casper.evaluate), alors vous devez vous inscrire à l'événement "remote.message":

casper.on("remote.message", function(msg){ 
    this.echo(msg); 
}); 

... 
casper.evaluate(function(){ 
    console.log("something from the page"); 
}); 

Tout le reste semble bien.

+0

belle! Merci pour l'information – Alejandro