2016-04-17 5 views
0

Ich habe ein Problem, wenn ich CasperJS verwende, um eine Website zu scrappen. Die Website wird dynamisch geladen wie Twitter, also möchte ich unendlich scrollen, und dank @Artjom B. Ich habe Code dafür gefunden.CasperJS: WaitFor Timeout-Funktion um Rescroll zu tun?

var tryAndScroll = function (casper) { 
    try { 
     casper.echo('SCROLL!!'); 
     casper.scrollToBottom(); 

     if (casper.exists('div.loading')) { 
      var curItems = casper.evaluate(getCurrentInfosNum); 
      casper.echo(curItems); 
      casper.waitFor(function check() { 
       return curItems != casper.evaluate(getCurrentInfosNum); 
      }, function then() { 
       casper.wait(800); 
       tryAndScroll(casper); 
      }, function onTimeout() { 
       casper.emit('scroll.timeout',curItems); 
      }, 15000); 
     } else { 
      casper.echo("No more items"); 
      return true; 
     } 
    } catch (err) { 
     casper.echo(err); 
    } 
} //casper.tryAndScroll 

Und jetzt möchte ich oft scrollen, um fortzufahren, wenn die Timeout-Funktion aufgerufen, damit ich meine eigenen Ereignis-Listener erstellen, ‚scroll.timeout‘.

var SRCOLL_NUM = 0; 
var PreOfLoaded = 0; 
casper.on('scroll.timeout', function (NumOfLoaded) { 
    if (SRCOLL_NUM <= 4) { 
     if (PreOfLoaded == NumOfLoaded) 
      SRCOLL_NUM++; 
     this.echo("Scroll Timeout,reScroll"); 
     PreOfLoaded = NumOfLoaded; 
     tryAndScroll(casper); 
    } else { 
     this.echo("Scroll Timeout,reScroll times maximum"); 
     SRCOLL_NUM = 0; 
     PreOfLoaded = 0; 
    } 
}); 

Wenn jedoch Scroll-Timeout aufgetreten ist, gedruckt es Scroll Timeout,reScroll auf der Konsole. Dann überspringt es tryAndScroll() und geht zum nächsten Schritt in der Hauptfunktion. Ich möchte mit dem nächsten Schritt nach dem Wiederholungsversuch viele Male weitermachen. Was soll ich machen?

fand ich CasperJS Autor illustrieren: Automatic retry when open fails

var casper = require('casper').create(); 

casper.tryOpen = function(url, then) { 
return this.then(function() { 
    this.open(url); 
    this.waitFor(function testStatus() { 
     return this.getCurrentHTTPStatus === 200; 
    }, then, function onFail() { 
     console.log('failed, retrying'); 
     this.tryOpen(url); 
    }, 2000); 
}); 
}; 

casper.start().tryOpen('http://failing.url.com/foo.bar', function() { 
this.echo('wow, it worked, wtf'); 
}).run(); 

leider ist es für mich nicht funktioniert.

Antwort

0

Versuchen Sie, diese

return this.currentHTTPStatus === 200; 

ich mit der neuesten Version von casperjs 1.1.1 getestet, es fein

funktioniert