根据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()
在两种不同情况下将处理添加到的步进功能:
- 当执行上一步功能时,
- 当先前的主要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对象。
flow
casperjs 的一般性解释,但是我发现您基本上无法在evaluate
调用中引用casper 。(即,您无法打开新的URL,日志,回显等)。因此,在我的情况下,评估被调用,但无法与外界互动。