[英]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.