-1

我一直在编写一个脚本,该脚本从网站上整理用户列表的分数。一个问题是,我试图在 while 循环中加载下一页,但该函数没有被加载......

casper.then(function () {
    var fs = require('fs');
    json = require('usernames.json');

    var length = json.username.length;
    leaderboard = {};
    for (var ii = 0; ii < length; ii++) {
        var currentName = json.username[ii];
        this.thenOpen("http://www.url.com?ul=" + currentName + "&sortdir=desc&sort=lastfound", function (id) {
                return function () {
                    this.capture("Screenshots/" + json.username[id] + ".png");
                    if (!casper.exists(x("//*[contains(text(), 'That username does not exist in the system')]"))) {

                        if (casper.exists(x('//*[@id="ctl00_ContentBody_ResultsPanel"]/table[2]'))) {
                            this.thenEvaluate(tgsagc.tagNextLink);

                            tgsagc.cacheCount = 0;
                            tgsagc.
                            continue = true;
                            this.echo("------------ " + json.username[id] + " ------------");
                            while (tgsagc.
                                continue) {
                                this.then(function () {
                                    this.evaluate(tgsagc.tagNextLink);
                                    var findDates, pageNumber;
                                    pageNumber = this.evaluate(tgsagc.pageNumber);
                                    findDates = this.evaluate(tgsagc.getFindDates);
                                    this.echo("Found " + findDates.length + " on page " + pageNumber);
                                    tgsagc.checkFinds(findDates);
                                    this.echo(tgsagc.cacheCount + " Caches for " + json.username[id]);
                                    this.echo("Continue? " + tgsagc["continue"]);
                                    this.click("#tgsagc-link-next");


                                });

                            }

                            leaderboard[json.username[id]] = tgsagc.cacheCount;
                            console.log("Final Count: " + leaderboard[json.username[id]]);
                            console.log(JSON.stringify(leaderboard));
                        } else {
                            this.echo("------------ " + json.username[id] + " ------------");
                            this.echo("0 Caches Found");
                            leaderboard[json.username[id]] = 0;
                            console.log(JSON.stringify(leaderboard));

                        }


                    } else {
                        this.echo("------------ " + json.username[id] + " ------------");
                        this.echo("No User found with that Username");
                        leaderboard[json.username[id]] = null;
                        console.log(JSON.stringify(leaderboard));

                    }
                });
4

2 回答 2

0
while (tgsagc.continue) {
    this.then(function(){
        this.evaluate(tgsagc.tagNextLink);
        var findDates, pageNumber;
        pageNumber = this.evaluate(tgsagc.pageNumber);
        findDates = this.evaluate(tgsagc.getFindDates);
        this.echo("Found " + findDates.length + " on page " + pageNumber);
        tgsagc.checkFinds(findDates);
        this.echo(tgsagc.cacheCount + " Caches for " + json.username[id]);
        this.echo("Continue? " + tgsagc["continue"]);
        return this.click("#tgsagc-link-next");
    });
}

好的,看看这段代码,我可以建议您进行一些更改:

  1. 我认为你不应该在 then() 中从你的函数中调用 return。这可能会过早终止该功能。查看casperjs 文档,这些示例也没有返回任何内容。
  2. 在您的 while 循环中,是什么将“tgsagc.continue”设置为 false?
  3. 不要使用“继续”作为变量名。它是 Javascript 中的保留字,用于终止循环的迭代。在您的情况下,这应该不是问题,但无论如何它都是不好的做法。
  4. 不要在调用 then() 函数时不断地重新定义方法。重构您的代码,以便在别处定义一次。
于 2013-11-13T01:12:01.323 回答
0

我们最终不得不限定函数的范围,因此它会在循环中加载下一页。

这主要是因为 CasperJS 不是为计算分数而设计的,它尝试异步进行计算,缺少所需的功能

于 2013-11-18T01:16:54.607 回答