簡體   English   中英

如何在 Casperjs 中處理涉及模態彈出窗口的異步請求?

[英]How can I deal with asynchronous requests involving modal popups in Casperjs?

嘗試遍歷打開模態彈出窗口的鏈接列表時,我遇到了 Javascript 異步性質的問題。 我可以遍歷鏈接,並且可以讓 Casperjs 單擊所有鏈接。 彈出窗口打開得很好(我需要保存該彈出窗口的內容)。 但是,我的代碼導致 Casperjs 每隔幾個鏈接就跳過一次——我懷疑這是因為延遲。 我需要確保每個鏈接都被點擊並保存了每個彈出窗口。 任何提示都非常感謝!

我知道 Casperjs wait 和 waitForSelector 函數,但無論我把它們放在哪里——它仍然會跳過一些彈出窗口。 我想這種行為的原因是延遲,但增加/減少等待值和我告訴 casperjs 等待的地方無濟於事。

this.then(function(){
    x = 0;
        this.each(links,function(self,link){
        // I only need links that contain a certain string
        if(link.indexOf('jugyoKmkName')>=0) {
            var coursetitle = linktexts[x];
            this.clickLabel(linktexts[x], 'a');
               this.wait(2000, function() {
                var coursetitleSplit = coursetitle.split(' ');
                var courseid = coursetitleSplit[0];

                //this logs the title and id in a file. Works perfectly
                var line = courseid+'   '+coursetitle+' \\n';
                        fs.write('/myappdirectory/alldata.txt', line, 'a');

                //this logs the popup contents -- but it's completely out of sync
                var courseinfo = this.getElementInfo('.rx-dialog-large').html
                fs.write('/myappdirectory/'+courseid+'.html', courseinfo, 'w');
            }); 
        } 
        x++;
     }); 
});

我在這里記錄了兩件事——運行日志文件中的鏈接文本(和一些更多信息)。 這工作正常 - 它正確捕獲每個鏈接。 鏈接文本包含一個唯一的 id,我將其用作文件名來保存彈出內容。 這僅適用於第 n 個彈出窗口——並且彈出內容和 id 不同步。

准確地說:列表中的前 10 個 id 是:

20000 -- 用這個 id 保存,但包含彈出窗口的數據 20215 20160 -- 用這個 id 保存,但包含彈出窗口的數據 20307 20211 -- 用這個 id 保存,但包含彈出窗口的數據 20312 20214 ...等(已保存,但從列表中更靠后的 ID 彈出) 20215 20225 20235 20236 20307 20308

顯然,我需要文件 2000.html 來保存 ID 為 20000、20160 和 20160 等內容的彈出窗口的內容。

大概this.each(links,...)將同步運行回調而不是等待每個this.wait()調用完成。 相反,您需要等到將數據寫入文件系統后再處理下一個鏈接。 請考慮以下代碼:

this.then(function() {
  function processNthLink(i) {
    var self = this;
    var link = links[i];

    if (link.indexOf('jugyoKmkName')>=0) {
      var coursetitle = linktexts[i];
      self.clickLabel(linktexts[i], 'a');
      self.wait(2000, function() {
        var coursetitleSplit = coursetitle.split(' ');
        var courseid = coursetitleSplit[0]; 
        var line = courseid+'   '+coursetitle+' \\n';
        fs.write('/myappdirectory/alldata.txt', line, 'a'); 
        var courseinfo = self.getElementInfo('.rx-dialog-large').html
        fs.write('/myappdirectory/'+courseid+'.html', courseinfo, 'w');

        if (i < links.length) {
          processNthLink(i+1);
        }
      }); 
    } else if (i < links.length) {
      processNthLink(i+1);
    }
  }

  processNthLink(0);
});

在這種情況下,只有在超時和寫入 FS 完成后才會處理下一個鏈接。 如果鏈接不包含預期的字符串,則立即處理下一個鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM