Согласно документации 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, журнал, эхо и т. д.). Итак, в моем случае была вызвана оценка, но без возможности взаимодействия с внешним миром.