2016-05-06 14 views
0

Ich habe Probleme, Dinge nach dem Klicken innerhalb einer Schleife innerhalb einer Evaluierungsfunktion zu behandeln. Ich kenne keinen anderen Weg, das zu behandeln.CasperJS - wie behandelt man einen 'Klick' innerhalb einer Schleife?

'Le' Code ...

links = this.evaluate(function(){ 
     story_boxes = __utils__.getElementsByXPath('//div[@id="contentCol"]//div[@id="stream_pagelet"]/div[contains(@id,"topnews_main_stream")]/div/div//div[contains(@data-ft,"{")]'); 

     for(x=0;x<=story_boxes.length;x++){ 
     story_box = story_boxes[x]; 
     boxID = story_box.getAttribute('id'); 

     //Is this feed a sponsored? 
     sponsored = story_box.querySelector('a.uiStreamSponsoredLink'); 
     if(sponsored){ 
      console.log("SPONSORED? " + sponsored ); 
      try{ 
      elink = story_box.querySelector('div > div > div > div > div > div > a'); 
      } 
      catch(e){ 
      console.log("Ooops! An error occured, sorry! " + e); 
      } 

      if(elink){ 
      console.log("FOUND IT!"); 
      crap = setTimeout(function(){ 
       elink.click(); //where can I treat this? 
      }, 1000); 

      break; 
      } 
      else { 
      console.log("NO DONUT FOR YOU!"); 
      } 
      console.log("\n\n#########"); 
     } 
     } 
     console.log("#####"); 

    }); 
    //... more irrelevant things 

Die Frage ist, wie kann ich behandeln jeden Klick? Ich brauche nur den Unterbaum des Klickergebnisses. Ich weiß nicht, ob ich hier klar bin. Wahrscheinlich nicht ...: P

Antwort

0

Ich vermute, dass Sie fragen, wie Sie mit dem Ergebnis des Klicks umgehen.

Wenn der Klick auf eine neue Seite zu laden, führt, dann kann man einfach einen Warteschritt nach dem Code hinzufügen und lassen CasperJS behandeln das Laden der Seite:

casper.then(function(){ 
    var success = this.evaluate(function(){ 
     ... 
     if(elink){ 
      console.log("FOUND IT!"); 
      crap = setTimeout(function(){ 
       elink.click(); //where can I treat this? 
      }, 1000); 

      return true; 
     } 
     ... 
     return false; 
    }); 

    if (success) { 
     this.wait(1100, function(){ 
      // TODO: do something with the loaded page 
     }) 
    } else { 
     // TODO: do something on fail 
    } 
}) 

Wenn der Klick die vorhandene Seite ändert, dann müssen Sie auf eine solche Änderung warten. Es gibt viele Funktionen, die CasperJS für einen solchen Fall bietet. Alle beginnen mit wait. Zum Beispiel:

casper.then(function(){ 
    this.evaluate(...); 
}).wait(1100).waitForSelector('some new element selector', function _then(){ 
    // TODO: do something with the loaded page 
}, function _onTimeout(){ 
    // TODO: do something on fail 
})