私はcasperJSとslimerJSエンジンを使用して、ajax応答によってロードされたビデオを取得しています。
ステップ
- URL のリストを取得する
- リスト内の各 URL に対する casper.open の再帰呼び出し
- 各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の間にページをクリアしようとしましたが、まだ機能していません。
前もって感謝します。