2017-06-02 36 views
0

我正在編寫CasperJS腳本來自動化搜索表單並捕獲後續頁面。但是,搜索表單會首先進入加載啓動頁面,直到數據到達。所以我添加了waitForSelector函數,它似乎可以用於我的某些頁面,但其他函數返回變量name作爲NULL。如果真的「等待」該元素在DOM上,那該如何呢?這個變量仍然是NULL

casper.each(searchPages,function(casper,index){ 
    var currentTime = new Date(); 
    var month = currentTime.getMonth() + 2; 
    var day = currentTime.getDate(); 
    var year = currentTime.getFullYear(); 
    var dateStart = month + "/" + day + "/" + year; 
    month = currentTime.getMonth() + 3; 
    var dateEnd = month + "/" + day + "/" + year; 

    casper.thenOpen(url,function(){ 
     var myfile = "data-"+year + "-" + month + "-" + day+".html"; 
     this.evaluate(function(j) { 
      document.querySelector('select[name="searchParameters.localeId"]').selectedIndex = j; 
     },index); 
     this.evaluate(function(start) { 
      $("#leaveDate").val(start); 
     },dateStart); 
     this.evaluate(function(end) { 
      $("#returnDate").val(end); 
     },dateEnd); 
     this.evaluate(function() { 
      $("#OSB_btn").click(); 
     }); 

     this.waitForSelector('#destinationForPackage', function() { 
      var name = casper.evaluate(function() { 
       return $("#destinationForPackage option[value='" + $("#destinationForPackage").val() + "']").text() 
      }); 
      if (name != "Going To"){ 
       if (name == null){ 
        console.log("it's null"); 
       }else{ 
        name = name.replace("/","_"); 
        casper.capture('Captures/Searches/search_' + name + '.jpg'); 
        console.log("Capturing search_" + name); 
       } 
      } 
     },function(){ 
      console.log("Search page timed-out."); 
     },20000); 
    }); 
}); 
+0

「怎麼會是這樣,如果它是真正的‘等待’該元素是在DOM?你不是在等*那*元素。你正在等待'#destinationForPackage',但'name'不是那個元素;它是'$('#destinationForPackage選項...')。text()'的結果。 –

+0

@JordanRunning好的,但'#destinationForPackage'是一個選擇框元素,據我的理解,相應的函數和代碼將不會被執行,直到'#destinationForPackage'在DOM上。沒有? – TheValyreanGroup

+0

@JordanRunning你知道如何解決這個問題嗎? – TheValyreanGroup

回答

0

我能夠通過創建遞歸函數來解決這個問題,如果元素仍然不可用。現在我有一個內存問題,雖然,在這裏新的問題=>CasperJS running out of memory

casper.each(searchPages,function(casper,index){ 
    loadSearch(casper,index); 
}); 


function loadSearch(casper,index){ 
    var currentTime = new Date(); 
    var month = currentTime.getMonth() + 2; 
    var day = currentTime.getDate(); 
    var year = currentTime.getFullYear(); 
    var dateStart = month + "/" + day + "/" + year; 
    month = currentTime.getMonth() + 3; 
    var dateEnd = month + "/" + day + "/" + year; 

    casper.thenOpen(url,function(){ 
     var myfile = "data-"+year + "-" + month + "-" + day+".html"; 
     this.evaluate(function(j) { 
      document.querySelector('select[name="searchParameters.localeId"]').selectedIndex = j; 
     },index); 
     this.evaluate(function(start) { 
      $("#leaveDate").val(start); 
     },dateStart); 
     this.evaluate(function(end) { 
      $("#returnDate").val(end); 
     },dateEnd); 
     this.evaluate(function() { 
      $("#OSB_btn").click(); 
     }); 

     this.waitForSelector('#destinationForPackage', function() { 
      if (this.exists('#destinationForPackage')){ 
       var name = casper.evaluate(function() { 
        return $("#destinationForPackage option[value='" + $("#destinationForPackage").val() + "']").text() 
       }); 
       if (name != "Going To"){ 
        if (name == null){ 
         console.log("it's null"); 
        }else{ 
         name = name.replace("/","_"); 
         casper.capture('Captures/Searches/search_' + name + '.jpg'); 
         console.log("Capturing search_" + name); 
        } 
       } 
      }else{ 
       console.log("Still doesn't exist...retry"); 
       loadSearch(casper,index); 
      } 

     },function(){ 
      console.log("Search page timed-out."); 
     },20000); 
    }); 
}