1. ホーム
  2. javascript

[解決済み] CasperJSの'Then'の本当の意味とは?

2023-01-22 01:33:13

質問

CasperJSを使って、Webサイトでの一連のクリック、フォームの入力、データの解析などを自動化しています。

Casperは、あらかじめ設定されたステップのリストに整理されているようで、その形式は then ステートメントで構成されているようです(その例はこちら。 http://casperjs.org/quickstart.html ) がありますが、次のステートメントが実際に実行されるきっかけとなるものが不明です。

例えば then は保留中のリクエストが完了するのを待つのでしょうか? では injectJS は保留中のリクエストとしてカウントされますか?もし then ステートメントをネストした場合、どうなりますか? open ステートメントの末尾に連鎖しているのですか?

casper.thenOpen('http://example.com/list', function(){
    casper.page.injectJs('/libs/jquery.js');
    casper.evaluate(function(){
        var id = jQuery("span:contains('"+itemName+"')").closest("tr").find("input:first").val();
        casper.open("http://example.com/show/"+id); //what if 'then' was added here?
    });
});

casper.then(function(){
    //parse the 'show' page
});

CasperJSのフローの仕組みについて、技術的な説明を求めています。 私の具体的な問題は、私の最後の then ステートメント(上記)が、私の casper.open ステートメント & の前に実行されます。

どのように解決するのですか?

then() は、基本的にスタックに新しいナビゲーションステップを追加します。ステップとは、2つの異なることを行うことができるjavascript関数です。

  1. 前のステップが実行されるのを待ちます。
  2. 要求された URL と関連ページのロード待ち

簡単なナビゲーションシナリオを考えてみましょう。

var casper = require('casper').create();

casper.start();

casper.then(function step1() {
    this.echo('this is step one');
});

casper.then(function step2() {
    this.echo('this is step two');
});

casper.thenOpen('http://google.com/', function step3() {
    this.echo('this is step 3 (google.com is loaded)');
});

このようにスタック内で作成されたすべてのステップを出力することができます。

require('utils').dump(casper.steps.map(function(step) {
    return step.toString();
}));

それは与える。

$ casperjs test-steps.js
[
    "function step1() { this.echo('this is step one'); }",
    "function step2() { this.echo('this is step two'); }",
    "function _step() { this.open(location, settings); }",
    "function step3() { this.echo('this is step 3 (google.com is loaded)'); }"
]

注目すべきは _step() 関数は、CasperJS によって自動的に追加され、url を読み込んでくれます。url が読み込まれると、スタックの中で利用可能な次のステップ - それは step3() - が呼び出されます。

ナビゲーションのステップを定義すると run() はそれらを一つずつ順番に実行します。

casper.run();

脚注です。 コールバック/リスナーの実装は プロミスパターン .