2013-07-08 53 views
1

我很想找到解決這個問題的辦法。如何在點擊後獲取更新的內容?

  1. 打開一個頁面anche得到具體聯繫
  2. 點擊一個鏈接(分頁鏈接)得到的結果的第二頁
  3. 閱讀新內容再次獲得新的鏈接....

這是我的一塊casperjs應用程序:

var page = 1; 

function getLinks() {  
    var links = __utils__.getElementsByXPath('//div[@class="myDiv"]//a'); 

    return Array.prototype.map.call(links, function(e) { 
     return e.getAttribute('href') 
    }); 
} 

casper.start("www.example.com", function(){ 
    // 
}) 

casper.repeat(2, function() { 

    this.then(function(){ 
     links = this.evaluate(getLinks); 
     links = links.concat(links);  
    }); 

    this.then(function(){ 
     page++;  
     this.clickLabel(String(page), 'a'); 
    }); 

}); 

正如你可以看到我有內部重複兩個步驟。我已經設置了2個,因爲我只需要檢查兩個頁面。

目前我的問題是「點擊」。它的工作原理是因爲新的Url被調用,但問題是第一步將立即執行,因此新的內容未被完全加載。所以,當我再次調用getLinks()時,我仍然在處理以前的內容。

我明顯想在頁面完全加載時得到鏈接。我該怎麼做 ?

謝謝!

回答

-1

常問問題我該如何延遲一些代碼,以使虛擬瀏覽器有時間加載和/或呈現頁面上的點擊或其他JavaScript動作的結果?

window.setTimeout(
    function() { 
     // process page here 
    }, 
    2000 // number of milliseconds to wait (here 2s) 
); 

很容易,不是嗎!你的情況,你會:

do_click(); 
window.setTimeout(
    function() { process_click_result(); }, 
    2000 // 2 seconds 
); 
+0

'setTimeout'並不適用於這種情況,因爲即使超時被用完之前,卡斯帕將只執行下一個計劃的步驟,並且退出。 –

0

你可以檢索這樣的鏈接之前在前面加上wait

casper.repeat(2, function() { 
    this.wait(2000); // 2 seconds 

    this.then(function(){ 
     links = this.evaluate(getLinks); 
     links = links.concat(links);  
    }); 

    this.then(function(){ 
     page++; 
     this.clickLabel(String(page), 'a'); 
    }); 

}); 

你也可以附加一個waitForResource點擊後,以確保在頁面加載。我這裏假設的頁碼是網址中爲page=x

casper.repeat(2, function() { 
    this.then(function(){ 
     links = this.evaluate(getLinks); 
     links = links.concat(links);  
    }); 

    this.then(function(){ 
     page++; 
     this.clickLabel(String(page), 'a'); 
    }); 

    this.waitForResource(new RegExp("page="+page)); 
});