[解決済み] CasperJSの'Then'の本当の意味とは?
質問
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関数です。
- 前のステップが実行されるのを待ちます。
- 要求された 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();
脚注です。 コールバック/リスナーの実装は プロミスパターン .
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] 私のJavaScriptコードは "No 'Access-Control-Allow-Origin' header is present on requested resource "というエラーを受け取りますが、Postmanはそうならないのはなぜですか?
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] javascript:void(0)」とは何ですか?
-
[解決済み】JavaScript版sleep()とは?)
-
[解決済み] javascript includes() 大文字小文字を区別しない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 文字列がすべて同じ部分文字列で構成されているかどうかを調べるにはどうすればよいですか?
-
[解決済み] javascript の関数から `undefined` と `null` のどちらを返すのが良いのでしょうか?
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] javascript includes() 大文字小文字を区別しない
-
[解決済み] react-routerのハッシュフラグメントからクエリパラメータを取得する
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] なぜjavascriptのES6 Promisesはresolve後も実行を継続するのですか?
-
[解決済み] JavaScriptのArray.sort()メソッドでシャッフルするのは正しいのか?
-
[解決済み] javascriptのキャンバスで画像をリサイズする (スムーズ)
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?