CasperJSドキュメントによると:
then()
署名: then(Function then)
このメソッドは、単純な関数を提供することにより、スタックに新しいナビゲーションステップを追加する標準的な方法です。
casper.start('http://google.fr/');
casper.then(function() {
this.echo('I\'m in your google.');
});
casper.then(function() {
this.echo('Now, let me write something');
});
casper.then(function() {
this.echo('Oh well.');
});
casper.run();
必要なだけステップを追加できます。現在のCasper
インスタンスは、this
step関数内でキーワードを自動的にバインドすることに注意してください。
定義したすべてのステップを実行するには、run()
メソッドを呼び出してください。
注:このメソッドstart()
を使用するには、キャスパーインスタンスが必要then()
です。
警告:に追加されたステップ関数then()
は、2つの異なるケースで処理されます。
- 前のステップ関数が実行されたとき、
- 前のメインHTTPリクエストが実行され、ページが読み込まれたとき。
ロードされるページの単一の定義はないことに注意してください。DOMReadyイベントがトリガーされたときですか?それは「すべてのリクエストが終了した」のですか?「すべてのアプリケーションロジックが実行されている」ですか。または「レンダリングされているすべての要素」?答えは常に状況に依存します。したがって、waitFor()
実際に期待することを明示的に制御するために、常にファミリメソッドを使用することをお勧めします。
一般的なトリックは、使用することwaitForSelector()
です:
casper.start('http://my.website.com/');
casper.waitForSelector('#plop', function() {
this.echo('I\'m sure #plop is available in the DOM');
});
casper.run();
舞台裏でのソースコードをCasper.prototype.then
以下に示します:
/**
* Schedules the next step in the navigation process.
*
* @param function step A function to be called as a step
* @return Casper
*/
Casper.prototype.then = function then(step) {
"use strict";
this.checkStarted();
if (!utils.isFunction(step)) {
throw new CasperError("You can only define a step as a function");
}
// check if casper is running
if (this.checker === null) {
// append step to the end of the queue
step.level = 0;
this.steps.push(step);
} else {
// insert substep a level deeper
try {
step.level = this.steps[this.step - 1].level + 1;
} catch (e) {
step.level = 0;
}
var insertIndex = this.step;
while (this.steps[insertIndex] && step.level === this.steps[insertIndex].level) {
insertIndex++;
}
this.steps.splice(insertIndex, 0, step);
}
this.emit('step.added', step);
return this;
};
説明:
つまり、then()
ナビゲーションプロセスの次のステップをスケジュールします。
場合then()
と呼ばれ、それがステップとして呼び出されるパラメータとして関数に渡されます。
インスタンスが起動したかどうかをチェックし、起動していない場合は、次のエラーを表示します。
CasperError: Casper is not started, can't execute `then()`.
次に、page
オブジェクトがかどうかをチェックしますnull
。
条件がtrueの場合、Casperは新しいpage
オブジェクトを作成します。
その後then()
、step
パラメーターを検証して、それが関数でないかどうかを確認します。
パラメータが関数でない場合、次のエラーが表示されます。
CasperError: You can only define a step as a function
次に、関数はCasperが実行されているかどうかを確認します。
Casperが実行されていない場合then()
は、ステップをキューの最後に追加します。
そうでない場合、Casperが実行されていると、前のステップよりも深いレベルのサブステップが挿入されます。
最後に、then()
関数はstep.added
イベントを発行して終了し、Casperオブジェクトを返します。
flow
casperjs の一般的な説明はまだ探していますが、基本的にevaluate
呼び出し内からcasperjsを参照できないことを発見しました。(つまり、新しいURL、ログ、エコーなどを開くことはできません)。したがって、私の場合、evaluateが呼び出されていましたが、外部の世界と対話する方法がありませんでした。