Согласно документации 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()
метод и вуаля.
Примечание.start()
Для использования then()
метода необходим экземпляр casper .
Предупреждение: добавленные пошаговые функции 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
Затем функция проверяет, запущен ли Каспер.
Если Каспер не запущен, then()
добавляет шаг в конец очереди.
В противном случае, если Casper запущен, он вставляет подшаг на уровень глубже, чем предыдущий.
Наконец, then()
функция завершается генерацией step.added
события и возвращает объект Casper.
flow
принципов casperjs, но обнаружил, что вы не можете ссылаться на casper изevaluate
вызова. (т.е. вы не можете открыть новый URL, журнал, эхо и т. д.). Итак, в моем случае была вызвана оценка, но без возможности взаимодействия с внешним миром.