Відповідно до Документації 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
ключове слово для вас у межах функцій кроку.
Щоб виконати всі визначені вами кроки, зателефонуйте run()
методу та voila.
Примітка.start()
Щоб скористатися then()
методом, ви повинні використовувати екземпляр каспер .
Попередження: Додані функції крок then()
обробляються у двох різних випадках:
- коли функція попереднього кроку була виконана,
- коли попередній основний 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
.
Якщо умова справжня, Каспер створює новий page
об’єкт.
Після цього then()
перевіряє step
параметр, щоб перевірити, чи він не є функцією.
Якщо параметр не є функцією, він відображає таку помилку:
CasperError: You can only define a step as a function
Потім функція перевіряє, чи працює Casper.
Якщо Casper не працює, then()
додає крок до кінця черги.
В іншому випадку, якщо Casper запущений, він вставляє підступень на рівень глибший за попередній крок.
Нарешті, then()
функція завершується випуском step.added
події та повертає об'єкт Casper.
flow
casperjs, але я виявив, що ви, по суті, не можете посилатися на каспера в межахevaluate
дзвінка. (тобто ви не можете відкрити новий URL, журнал, ехо тощо). Тож у моєму випадку оцінювали, але не було можливості взаємодіяти із зовнішнім світом.