我如何处理 Casperjs 中涉及模式弹出窗口的异步请求?
How can I deal with asynchronous requests involving modal popups in Casperjs?
尝试遍历打开模式弹出窗口的 link 列表,我 运行 遇到了 Javascript 的异步性质的问题。我可以遍历 links,我可以让 Casperjs 单击所有 links。弹出窗口打开得很好(我需要保存该弹出窗口的内容)。但是,我的代码导致 Casperjs 每隔 links 就跳过一次——我怀疑这是因为延迟。我需要确保单击每个 link 并保存每个弹出窗口。非常感谢任何提示!
我知道 Casperjs wait 和 waitForSelector 函数,但无论我把它们放在哪里 -- 它仍然会跳过一些弹出窗口。我想这种行为的原因是延迟,但是 increasing/decreasing 我告诉 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++;
});
});
我在这里记录了两件事 -- link 文本(以及更多信息)在 运行 日志文件中。这工作正常——它正确地捕获了每个 link。 link 文本包含一个唯一 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()
调用完成。相反,您需要等到将数据写入文件系统后再处理下一个 link。请考虑以下代码:
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);
});
在这种情况下,下一个link将仅在超时和写入 FS 完成后才被处理。如果 link 不包含预期的字符串,则立即处理下一个 link。
尝试遍历打开模式弹出窗口的 link 列表,我 运行 遇到了 Javascript 的异步性质的问题。我可以遍历 links,我可以让 Casperjs 单击所有 links。弹出窗口打开得很好(我需要保存该弹出窗口的内容)。但是,我的代码导致 Casperjs 每隔 links 就跳过一次——我怀疑这是因为延迟。我需要确保单击每个 link 并保存每个弹出窗口。非常感谢任何提示!
我知道 Casperjs wait 和 waitForSelector 函数,但无论我把它们放在哪里 -- 它仍然会跳过一些弹出窗口。我想这种行为的原因是延迟,但是 increasing/decreasing 我告诉 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++;
});
});
我在这里记录了两件事 -- link 文本(以及更多信息)在 运行 日志文件中。这工作正常——它正确地捕获了每个 link。 link 文本包含一个唯一 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()
调用完成。相反,您需要等到将数据写入文件系统后再处理下一个 link。请考虑以下代码:
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);
});
在这种情况下,下一个link将仅在超时和写入 FS 完成后才被处理。如果 link 不包含预期的字符串,则立即处理下一个 link。