0

私はcasperJSとslimerJSエンジンを使用して、ajax応答によってロードされたビデオを取得しています。

ステップ

  1. URL のリストを取得する
  2. リスト内の各 URL に対する casper.open の再帰呼び出し
  3. casper.open呼び出しは、前のcasper.openが ajax 応答を送信するのを待つ必要があります。

最初の 2 点はうまく機能します。3番目に問題があります。次のcasper.openをロードする前に、ページのロードが完了するのを待つ必要がないことを理解することが重要です。各 URL から 1 つの ajax 応答を待つだけです。この応答をキャッチすると、この URL を閉じて次の URL を開くことができます。

そのために、再帰ループは最初の出現から始まります。次に、resource.received イベントでネットワークをリッスンし、特別な contentType を待ちます。この contentType は、ビデオをロードするための URL を見つけることができる応答を返します。この URL を 1 つの配列に保存し、このcasper.openを閉じて次の配列を開始できます。

これが私のコードです:

// Some JS code...

function receiver(resource) {
    if (resource.contentType == 'myContentType') {
        sources.push(resource.url);// When catch good conteType, push in sources array
    }
}
casper.on("resource.received", receiver); // Listen responses

// Some JS code...

// Login below
casper.then(function() {
    this.evaluate(function(username, password) {
        document.querySelector('#username').value = username;
        document.querySelector('#password').value = password;
        document.querySelector('#LoginSend').click();
    }, username, password);
});

casper.then(function() {
    this.wait(1000, function() {
        this.waitFor(function() {
            urls = this.evaluate(function() {
                //Get and return all urls
            });
            return true;
        });
    });
});

casper.then(function() {
    this.wait(1000, function() {
        click_link();
    });
});

function click_link() {
    casper.then(function() {
        this.wait(1000, function() {
            this.open(address + urls[i]);// Open new url, i tried with theOpen, don't work too.
            this.waitFor(function() {
                return !!sources[i]; // Wait for the contentType is catch
            }, function() {
                sources.pop(); // Because resource.received has two staged
                this.wait(2000, function() {
                    // Until we don't go to all url, recursive call
                    if (sources.length < urls.length) {
                        i++;
                        click_link();
                    }
                });
            });
        });

    });
}

// Some JS code...

問題は、最初のcasper.openがページを開き、適切な contentType をキャッチするのを待って、配列ソースに適切な URL を保存することです。次に、次のcasper.openが呼び出され、プログラムはwaitForに永遠に留まります。それは、contentType が決してキャッチされないためです.しかし、それは前のものと同じ種類のページです。最初にこの 2 ページ目から始めると、うまくいきます。機能しないのは再帰ループの次の発生のみであり、最初の発生は問題ではありません。
また、これらのページをブラウザー (chrome または firefox) で開くと、うまく機能します。彼は contentType をキャッチします。だから、問題は私のプログラムから来ています。
resource.received リスナー中にエラーが発生することがあります:「エラータイプ $.cookie」。しかし、jquery.cookie.js があったとしても、機能しません。

ページを閉じるか、Cookie を保存して、各casper.openの間にページをクリアしようとしましたが、まだ機能していません。

前もって感謝します。

4

0 に答える 0