我正在使用CasperJS来搜索网站以获取数据。我的程序在表中找到<a>
标记,单击它,从新页面获取一些数据,返回上一页并重复下一个<a>
标记的过程。
一切顺利,直到我偶然发现了最奇怪的问题:CasperJS for循环在三个块中产生相同的结果。无论第一次迭代返回什么,接下来的两次迭代都将返回相同的数据。它重复这个过程
示例
这个循环...
casper.then(function() {
var i = 1;
var j = 9;
var bookingNumber = 0;
var location = '';
for (; i <= j;) {
(function(index, max) {
casper.then(function() {
casper.waitForSelector(x('//*[@id="ListInmateNames"]/table'), function() {
casper.click(x('//*[@id="ListInmateNames"]/table/tbody/tr[' + index + ']/td[1]/a'));
this.echo('Loading details for inmate ' + index + ' of ' + max + '...', 'COMMENT');
});
});
casper.then(function() {
casper.waitForSelector(x('//*[@id="pnlResults"]/div[2]'), function() {
bookingNumber = casper.fetchText(x('//*[@id="lblResults"]'));
location = casper.fetchText(x('//*[@id="hlHousingLocation"]'));
this.echo(bookingNumber);
this.echo(location);
});
});
casper.then(function() {
casper.back();
});
})(i, j);
i++;
}
});
...产生此输出。
> Loading details for inmate 1 of 9... 2985842 Theo Lacy Facility
> Loading details for inmate 2 of 9... 2985842 Theo Lacy Facility
> Loading details for inmate 3 of 9... 2985842 Theo Lacy Facility
> Loading details for inmate 4 of 9...
> Loading details for inmate 5 of 9...
> Loading details for inmate 6 of 9...
> Loading details for inmate 7 of 9... 2993051 Central Mens Jail
> Loading details for inmate 8 of 9... 2993051 Central Mens Jail
> Loading details for inmate 9 of 9... 2993051 Central Mens Jail
是什么让它变得非常奇怪(以及我为什么这么问)
无论什么,它都会以三个的块的形式返回相同的数据。我坐了几百次迭代,它仍然产生相同的图案输出。我认为使用同步JavaScript运行的CasperJS的异步特性不会始终如一地产生这种模式。但确实如此。
有趣的是,输出块之间有一点延迟。程序将回显迭代1-3,然后等待一秒,然后回显迭代4-6,然后等待一秒钟。这是一贯的行为。
此外,在for循环中递增i ++计数器两次仍然会产生相同的三块图案输出行为,这意味着在循环中增加i ++两次产生这个输出......
> Loading details for inmate 1 of 9... 2985842 Theo Lacy Facility
> Loading details for inmate 3 of 9... 2985842 Theo Lacy Facility
> Loading details for inmate 5 of 9... 2985842 Theo Lacy Facility
...希望你明白了。
我尝试了什么
for (; i <= j; i++)
并删除i++
语句const
或let
index
和max
重命名为i
和j
TL; DR :我的CasperJS for循环始终以三个块的形式产生输出。第二次和第三次迭代的输出将是第一次迭代的输出。在任何情况下都不会改变。
如果有人能帮助我并阻止我自己开枪并结束我一直困扰着我的梦想的这个问题,那将是惊人的,我会亲自送你一个饼干。