根据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()
使用 casper 实例才能使用该then()
方法。
警告:添加到的阶跃函数then()
在两种不同的情况下进行处理:
- 当上一个 step 函数已经执行时,
- 当先前的主 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
.
如果条件为真,Casper 将创建一个新page
对象。
之后,then()
验证step
参数以检查它是否不是函数。
如果参数不是函数,则会显示以下错误:
CasperError: You can only define a step as a function
然后,该函数检查 Casper 是否正在运行。
如果 Casper 未运行,then()
则将该步骤附加到队列的末尾。
否则,如果 Casper 正在运行,它会插入一个比上一步更深的子步骤。
最后,该then()
函数通过发出一个step.added
事件结束,并返回 Casper 对象。