Menurut Dokumentasi CasperJS :
then()
Tanda tangan: then(Function then)
Metode ini adalah cara standar untuk menambahkan langkah navigasi baru ke tumpukan, dengan menyediakan fungsi sederhana:
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();
Anda dapat menambahkan langkah sebanyak yang Anda butuhkan. Perhatikan bahwa Casper
contoh saat ini secara otomatis mengikat this
kata kunci untuk Anda dalam fungsi langkah.
Untuk menjalankan semua langkah yang Anda tentukan, panggil run()
metode, dan voila.
Catatan: Anda harus start()
contoh casper untuk menggunakan then()
metode ini.
Peringatan: Fungsi langkah yang ditambahkan ke then()
diproses dalam dua kasus berbeda:
- ketika fungsi langkah sebelumnya telah dijalankan,
- ketika permintaan HTTP utama sebelumnya telah dijalankan dan halaman dimuat ;
Perhatikan bahwa tidak ada definisi tunggal tentang halaman yang dimuat ; apakah itu ketika acara DOMReady telah dipicu? Apakah ini "semua permintaan diselesaikan"? Apakah itu "semua logika aplikasi sedang dilakukan"? Atau "semua elemen sedang dirender"? Jawabannya selalu tergantung pada konteksnya. Oleh karena itu mengapa Anda didorong untuk selalu menggunakan waitFor()
metode keluarga untuk tetap mengontrol secara eksplisit apa yang sebenarnya Anda harapkan.
Trik yang umum digunakan adalah waitForSelector()
:
casper.start('http://my.website.com/');
casper.waitForSelector('#plop', function() {
this.echo('I\'m sure #plop is available in the DOM');
});
casper.run();
Di balik layar, kode sumber untukCasper.prototype.then
ditampilkan di bawah ini:
/**
* 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;
};
Penjelasan:
Dengan kata lain, then()
menjadwalkan langkah berikutnya dalam proses navigasi.
Ketika then()
dipanggil, itu melewati fungsi sebagai parameter yang akan disebut sebagai langkah.
Ia memeriksa apakah sebuah instance telah dimulai, dan jika belum, ini akan menampilkan kesalahan berikut:
CasperError: Casper is not started, can't execute `then()`.
Selanjutnya, ia memeriksa apakah page
objeknya null
.
Jika kondisinya benar, Casper membuat page
objek baru .
Setelah itu, then()
validasi step
parameter untuk memeriksa apakah itu bukan fungsi.
Jika parameter bukan fungsi, ini akan menampilkan kesalahan berikut:
CasperError: You can only define a step as a function
Kemudian, fungsi tersebut memeriksa apakah Casper sedang berjalan.
Jika Casper tidak berjalan, then()
menambahkan langkah ke akhir antrian.
Jika tidak, jika Casper sedang berjalan, Casper akan memasukkan sub-langkah yang lebih dalam dari langkah sebelumnya.
Terakhir, then()
fungsi tersebut diakhiri dengan memancarkan step.added
peristiwa, dan mengembalikan objek Casper.
flow
casperjs, tetapi saya telah menemukan bahwa pada dasarnya Anda tidak dapat merujuk casper dari dalamevaluate
panggilan. (yaitu Anda tidak dapat membuka url baru, log, echo, dll). Jadi dalam kasus saya, evaluasi dipanggil tetapi tidak ada cara untuk berinteraksi dengan dunia luar.